AT&T汇编处理字符串
一.传送字符串把字符串从一个内存位置复制到另一个内存位置。1.MOVS3种格式:MOVSB:传送单一字节MOVSW:传送一个字(2字节)MOVSL:传送一个双字(4字节)MOVS使用隐含的源(ESI)、目的(EDI)操作数。两种加载ESI、EDI值的方式:1)间接寻址:movl $output, %edi2)lea指令加载一个对象的有效地址leal output, %esi每次执行MOVS指令时,数据传送后,ESI和EDI寄存器会自动改变,为另一次传送做准备。ESI、EDI可能递增也可能递减,这取决于EFLAGS中的DF标志。如果DF被清零则递增,DF被设置,则递减。CLD将DF清零STD设置DF标志示例:[cpp]# An example of the MOVS instructions.section .datastr:.ascii "Hi AT&T.\n".section .bss.lcomm output, 9.section .text.global _start_start:nopleal str, %esileal output, %edimovsbmovswmovslmovl $1, %eaxmovl $0, %ebxint $0x80调试:liury@liury-laptop:~/program/asm/working_with_string/movs_example$ makeas -gstabs -o movs_example.o movs_example.sld -o movs_example movs_example.oliury@liury-laptop:~/program/asm/working_with_string/movs_example$ lsmakefile movs_example movs_example.o movs_example.sliury@liury-laptop:~/program/asm/working_with_string/movs_example$ gdb ./movs_exampleGNU gdb (GDB) 7.1-ubuntuCopyright (C) 2010 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "i486-linux-gnu".For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>...Reading symbols from /home/liury/program/asm/working_with_string/movs_example/movs_example...done.(gdb) l1 # An example of the MOVS instructions2 .section .data3 str:4 .ascii "Hi AT&T.\n"56 .section .bss7 .lcomm output, 989 .section .text10 .global _start(gdb) b *_start+1Breakpoint 1 at 0x8048075: file movs_example.s, line 15.(gdb) rStarting program: /home/liury/program/asm/working_with_string/movs_example/movs_exampleBreakpoint 1, _start () at movs_example.s:1515 leal str, %esi(gdb) n16 leal output, %edi(gdb) print /x $esi$1 = 0x8049094(gdb) print /x str$2 = 0x41206948(gdb) print /x &str$3 = 0x8049094(gdb) n18 movsb(gdb) x /9cb &output0x80490a0 <output>: 0 '\000'0 '\000'0 '\000'0 '\000'0 '\000'0 '\000'0 '\000'0 '\000'0x80490a8 <output+8>: 0 '\000'(gdb) x /s &output0x80490a0 <output>: ""(gdb) n19 movsw(gdb) x /s &output0x80490a0 <output>: "H"(gdb) n20 movsl(gdb) x /s &output0x80490a0 <output>: "Hi "(gdb) n22 movl $1, %eax(gdb) x /s &output0x80490a0 <output>: "Hi AT&T"(gdb) cContinuing.Program exited normally.(gdb) q对于要传送大型字符串,可用循环:[cpp]leal datas, %esileal output, %edimvol $100, %ecxcldloop_cp:movsbloop loop_cp2.REP可更简单地传送大型字符串。它自己并不执行什么操作,这条指令用于按照特定次数重复执行字符串指令,由ECX寄存器中的值进行控制。例如[cpp]leal datas, %esileal output, %edimvol $100, %ecxcldrep movsbMOVSW,MOVSL传送大型字符串效率更高,但小心不能除尽的情况。有些REP指令除监视ECX外还监视ZF(零标志)的状态。--------------------------------------------------指令 描述-------------------------------------------REPE 等于时重复REPNE 不等于时重复REPNZ 不为0时重复REPZ 为0时重复---------------------------------------------------二.存储和加载字符串1.LODS用于把内存中的字符串传送到EAX。三种形式:LODSB:把一个字节加载到ALLODSW:把一个字加载到AXLODSL:把一个双字加载到EAXLODS指令使用ESI寄存器作为隐含的源操作数。ESI必须包含要加载的字符串所在的内存地址。同样加载后ESI递增或递减取决于DF标志。2.STOS把字符串从EAX放到一个内存地址。STOSB:存储AL中一个字节数据STOSW:存储AX中一个字数据STOSL:存储EAX中一个双字数据STOS指令使用EDI作为隐含的目标操作数。可方便地与REP配合:[cpp]leal space, %esileal buffer, %edimovl $256, %ecxcldlodsbrep stosb字符串处理示例,小写变大写:[cpp]# Converting lower to upper case.section .datastr1:.asciz "This is a TEST, of the program, hello AT&R!\n"len:.int . - str1.section .text.global _start_start:nopleal str1, %esimovl %esi, %edimovl len, %ecxcld1:lodsb&n补充:软件开发 , 其他 ,
上一个:第一个makefile
下一个:vim 正则表达式获取双引号中的字符
- 更多其它软件疑问解答:
- java.lang.ExceptionInInitializerError问题
- 通过互联网实现视频会议的项目规划
- 如何将GPS接受的数据显示在电子地图上?
- 求解笔记本电池接解不良问题
- MapX中如何将地图的指定区域导出成图片?
- notes 服务器当机,出现namgr.exe 出错
- SAP免费公开课
- 在程序中調用RFC的Read_Text 取長文本 出錯!
- 正版MapInfo系列软件销售
- 这论坛怎么回事,我发帖就要重新登录,发布了啊?
- domino邮件服务器与outlook的问题
- 求救,关于DB.SEARCH里面的公式
- mapxtreme for java关于GPS移动目标刷新的问题
- 安装sametime 7.0时,最后一步报“notesinit failed”
- 史上最最厉害的老板!