【问题标题】:Difference between "mov eax, [num]" and "mov eax, num"“mov eax,[num]”和“mov eax,num”之间的区别
【发布时间】:2016-05-29 13:36:58
【问题描述】:

我是一个初学者,正在编写汇编程序以使用以下代码打印从 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]

【问题讨论】:

标签: assembly x86 nasm 32-bit


【解决方案1】:

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

mov ecx, num 等价于:

int num;
ecx = & num;

mov ecx, [num] 等价于:

int num;
ecx = num;

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

【讨论】:

  • 好吧,这意味着我们需要在“ecx”中指定“num”变量的地址,而不是它的值。因此中断将从该内存位置打印,即“ecx”。听起来很完美。谢谢
猜你喜欢
  • 2017-05-05
  • 2013-09-10
  • 2012-10-10
  • 1970-01-01
  • 2014-10-28
  • 2019-03-30
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多