2017-06-03 128 views
0

這是代碼的一部分,它乘以2和3:在上面的代碼MOV指令操作數鍵入

section .text 
global _start 
_start: 
mov al,'3' 
sub al, '0' 
mov bl, '2' 
sub bl, '0' 
mul bl 
add al, '0' 
;first question -> 
mov [res], al 
mov ecx,msg 
mov edx, len 
mov ebx,1 ;file descriptor (stdout) 
mov eax,4 ;system call number (sys_write) 
int 0x80 
;second question -> 
mov ecx,res 
mov edx, 1 
mov ebx,1 ;file descriptor (stdout) 
mov eax,4 ;system call number (sys_write) 
int 0x80 
mov eax,1 ;system call number (sys_exit) 
int 0x80 
section .data 
msg db "The result is:", 0xA,0xD 
len equ $- msg 
segment .bss 
res resb 1 

  1. 我們爲什麼要使用mov [res], al,不使用mov res, al
  2. 我們爲什麼要用mov ecx,res而不用mov ecx,[res]

****更新

我知道,一個是地址等是該值,但我不知道爲什麼...

+1

一個需要的地址,另一個值存儲在該地址 –

+0

tnx我的朋友。我知道,但我不知道爲什麼? – arianpress

回答

2

res是出了名的彙編,不過是表示價值的符號。
您已經知道res的值是其後第一個字節的地址。
我們非正式地說res是變量res的地址。

在這種考慮下,指令mov res, ecx沒有任何意義,desugared它相當於mov <a number>, ecx
一個具體的例子:mov 0x12345678, ecx - 轉變成立即沒有意義。

mov ecx, res有意義,它加載ecx,地址爲res
我們需要它的地址而不是它的值,因爲sys_write在你的案例中寫入了一個字節流(stdout) - 這與打印高級語言中的數字沒什麼兩樣。
實際上,單個數字的乘法結果被平均值轉換爲字符串add al, '0'
轉換後sys_write用於將字符串(不是數字!)寫入stdout
由於sys_write處理它所期望的字節流,它在ecx中寫入第一個字節的地址。
您可以查看C wrapper以檢查參數的類型:第二個參數爲const void*
所以必須給出地址(mov ecx, res)不是值(mov ecx, [res])。


要注意的是地址和值之間的區別純粹是語義,存在組件沒有這樣的除法。