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

标签 assembly x86 nasm 32-bit

我是一个初学者,正在编写汇编程序以使用以下代码打印从 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包含您号码的地址。所以应该是这样的。

关于assembly - "mov eax, [num]"和 "mov eax, num"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35463649/

相关文章:

assembly - 汇编中的复杂 IF 语句

linux - 如何在 Linux x86 中使用 nasm 以汇编语言保存文件?

windows - Windows 8 x64 上的汇编代码

assembly - NASM:%include 文件中操作码和操作数的组合无效,报告的行号超出末尾?

assembly - 如何在裸机ARM组装中使用键盘?

c++ - 语言之间的堆栈数据

performance - 点乘积性能与 SSE 指令

assembly - jmp 指令 *%eax

c++ - 数据类型的名称从何而来?

visual-studio - 结构的第一个成员在 VS 调试器中不可见