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

Sha*_*ham 2 x86 assembly 32-bit nasm

我是初学者,正在编写汇编程序以使用以下代码打印 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
Run Code Online (Sandbox Code Playgroud)

这里我们有以下三个声明:

  1. mov [num], eax
  2. mov ecx , 编号
  3. mov eax, [num]

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

Wha*_*sUp 8

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

mov ecx, num 相当于:

int num;
ecx = & num;
Run Code Online (Sandbox Code Playgroud)

whilemov ecx, [num]相当于:

int num;
ecx = num;
Run Code Online (Sandbox Code Playgroud)

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