"mov eax, [num]"和"mov eax, num"的区别



我是一个初学者,正在编写汇编程序,使用以下代码打印从 1 到 9 的数字:

section .text    
   global _start                    
_start:                     
   mov ecx,10    
   mov eax, '1'     
l1:    
   mov [num], eax    
   mov eax, 4    
   mov ebx, 1    
   push ecx     
   mov ecx, num            
   mov edx, 1            
   int 0x80     
   mov eax, [num]    
   sub eax, '0'    
   inc eax    
   add eax, '0'    
   pop ecx    
   loop l1      
   mov eax,1             ;system call number (sys_exit)    
   int 0x80              ;call kernel    
section .bss    
num resb 1

这里我们有以下三句话:

  1. MOV [NUM], EAX
  2. MOV ECX , NUM
  3. MOV EAX, [NUM]

我想知道为什么我们应该使用mov ecx,num而不是mov ecx,[num]

如果您熟悉 C/C++,这里有一个解释。

mov ecx, num相当于:

int num;
ecx = & num;

mov ecx, [num]相当于:

int num;
ecx = num;

在这里,行mov ecx, num的原因是因为您正在调用系统函数int 0x80,这要求ecx包含您的号码的地址。所以应该是这样的。

最新更新