MOVSB汇编语言代码如何工作?

时间:2013-12-13 19:59:52

标签: assembly x86 nasm

我不能为我的生活理解为什么下面的IA-32汇编代码有效。我将通过在下面逐行浏览代码来解释我不理解的部分。

section .text
   global main
main:
   mov ecx, len
   mov esi, s1
   mov edi, s2
   cld
   rep movsb
   mov edx,20 ;message length
   mov ecx,s2 ;message to write
   mov ebx,1 ;file descriptor (stdout)
   mov eax,4 ;system call number (sys_write)
   int 0x80 ;call kernel
   mov eax,1 ;system call number (sys_exit)
   int 0x80 ;call kernel
section .data
   s1 db 'Hello, world!', 0
   len equ $-s1
section .bss
   s2 resb 20

首先,将ecx设置为字符串的长度,以便rep对字符串中的所有字符重复movsb。接下来,将esi设置为等于字符串,并将edi设置为20个字节。接下来,我们清除方向标志,以便movsb在正确的方向上复制。最后,我们得到movsb助记符,它将字符从esi中指定的内存地址移动到edi中指定的内存地址。对于字符串中的每个字符重复这一过程。

我遇到的问题是,如果你看一下esi和edi,它们不会被设置为s1和s2的地址。它们被设置为s1和s2的值。如果我们想将寄存器设置为地址,我想我们必须使用“mov esi,[s1]”和“mov edi,[s2]”。然而,这不是代码所说的。代码是从教程到汇编编程,所以应该是正确的。

非常感谢帮助我深究这一点。

马格努斯

1 个答案:

答案 0 :(得分:3)

  

我遇到的问题是,如果你看一下esi和edi,它们不会被设置为s1和s2的地址。它们被设置为s1和s2的值。如果我们想将寄存器设置为地址,我想我们必须使用" mov esi,[s1]"和" mov edi,[s2]"。

你已经倒退了。
mov esi,foo用于将foo的地址放入esi mov esi,[foo]foo是用于将值放在esi上的mov esi,OFFSET foo mov esi,foo的地址mov esi,[foo]

请注意,不同汇编程序的语法不同。我上面所说的对于NASM来说是正确的(这是你已经表明你正在使用的),但是当你使用MASM / TASM时,你使用{{1}}获取地址,而{{1}}和{{1}}都会获得价值。