汇编实现大写转小写函数(to_lower)
生活随笔
收集整理的這篇文章主要介紹了
汇编实现大写转小写函数(to_lower)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
這個函數跟以前的寫法,改變有如下幾點:
用.equ偽指令,引用系統調用編號,.equ有點類似c語言里面的宏替換
用.lcomm偽指令,聲明一塊buffer
code:
.equ?BUFFER_SIZE,?512 .equ?SYS_READ,?3 .equ?SYS_WRITE,?4 .equ?SYS_EXIT,?1 .equ?STDIN,?0 .equ?STDOUT,?1 .equ?OFFSET,?'a'?-??'A' .equ?LINUX_SYSCALL,?0x80.section?.data .section?.bss .lcomm?BUFFER,?BUFFER_SIZE .section?.text.global?_start _start:#read(0,?BUFFER,?BUFFER_SIZE)movl?$SYS_READ,?%eaxmovl?$STDIN,?%ebxmovl?$BUFFER,?%ecxmovl?$BUFFER_SIZE,?%edxint?$LINUX_SYSCALL#判斷返回值cmpl?$0,?%eaxjle?_start_end#調用to_lowerpushq?%raxpushq?$BUFFERcall?to_lower#復位rspaddq?$16,?%rsp#打印到屏幕上movl?$SYS_WRITE,?%eaxmovl?$STDOUT,?%ebxmovl?$BUFFER,?%ecxmovl?$BUFFER_SIZE,?%edxint?$LINUX_SYSCALL_start_end:#調用exitmovl?$SYS_EXIT,?%eaxxorl?%ebx,?%ebxint?$LINUX_SYSCALL.type?to_lower,?@function to_lower:pushq?%rbpmovq?%rsp,?%rbp#獲取第一個參數movl?16(%rbp),?%edi#獲取第二個參數movl?24(%rbp),?%esi#edi為下標xorl?%edx,?%edxto_lower_begin:#esi?下標等于長度時退出循環cmpl?%edx,?%esijle?to_lower_end#取出當前字節movb?(%edi,?%edx,?1),?%clincl?%edx#如果是'A'?~?'Z'?改變buffer里面的值cmpb?$'A',?%cljl?to_lower_begincmpb?$'Z',?%cljg?to_lower_beginaddb?$OFFSET,?%clmovb?%cl,?-1(%edi,?%edx,?1)jmp?to_lower_beginto_lower_end:movq?%rbp,?%rsppopq?%rbpret編譯命令:
gcc?-g?-c?to_lower.s?&&?ld?./to_lower.o?&&?./a.out效果:
在終端輸入大寫字母,這時,這時屏幕會輸出小寫字母
轉載于:https://my.oschina.net/guonaihong/blog/493121
總結
以上是生活随笔為你收集整理的汇编实现大写转小写函数(to_lower)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 控制反转IOC与依赖注入DI
- 下一篇: vmware后台运行