2016-02-17 7 views
-1

Я новичок и написание сборки программы для печати чисел от 1 до 9, используя этот код:Разница между «MOV EAX, [число]» и «MOV EAX, Num»

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. мы ECX, Num
  3. MOV EAX, [число]

Я хочу знать, почему мы должны использовать mov ecx,num вместо mov ecx,[num]

+0

Разница объясняется в http://stackoverflow.com/a/33342016/1524450 – Michael

+2

Возможный дубликат [Основное использование непосредственных элементов (квадратных скобок) в x86 Сборка и ясность] (http://stackoverflow.com/questions/10362511/basic-use-of-immediatelyiates-square-brackets-in-x86-assembly-and-yasm) –

+0

Я написал руководство по [режимам адресации x86] (http://stackoverflow.com/a/34058400/ 224132), включая покрытие разницы между NASM и MASM в этом бите синтаксиса: «mov ecx, num» и «mov ecx, OFFSET num». Это была попытка написать ответ, что такие Qs могут быть связаны как дубликаты. –

ответ

2

Если вы знакомы с C/C++, вот объяснение.

mov ecx, num эквивалентно:

int num; 
ecx = & num; 

в то время как mov ecx, [num] эквивалентно:

int num; 
ecx = num; 

Здесь причина линии mov ecx, num потому, что вы вызываете систему функция int 0x80, для которой требуется, чтобы ecx содержит адрес ваших номеров. Так должно быть так.

+0

это означает, что нам нужно указать адрес переменной «num» в «ecx», а не его значение. Таким образом, прерывание будет печататься из этой ячейки памяти, а именно: «ecx». Звучит превосходно. Спасибо – Sham