我有以下代碼:
section .data
array times 1024 DW 0
section .text
global _start
_start:
mov ecx, array ; Store the ponter to the first array element
; ---- ADD ----
add dword [ecx], 8
label_1:
cmp dword [ecx], 0
je label_6
; ---- P UP ----
add ecx, 2
; ---- ADD ----
add dword [ecx], 15
; ---- p DOWN ----
sub ecx, 2
; ---- SUB ----
sub dword [ecx], 1
label_6: ; ---- P UP ----
add ecx, 2
mov eax, 4 ; stdout
mov ebx, 1 ; sys_write
mov edx, 1 ; Lenth
int 0x80 ; Call karnel
mov eax, 1 ; system call number (sys_exit)
int 0x80 ;call kernel
它列印一個字符,但是當我在jmp label_1上面添加一行時,label_6它不會列印任何內容。它應該列印字符x(8 * 15 = 120)。有什么變化ecx嗎?
uj5u.com熱心網友回復:
您的記憶體訪問重疊: adword是 4 個位元組,但您正在執行add ecx, 2and sub ecx, 2。這意味著您的第二個dword與第一個重疊。
您的計數器存盤在array[0..3],并被視為dword。當您這樣做時,add ecx, 2; add dword [ecx], 15您正在觸摸array[2..5],修改計數器的高兩個位元組,從0x00000008到0x000f0008。因此,如果您繼續這樣做,您的代碼幾乎將在無限回圈中運行。
更新您的偏移量4,您的代碼應該可以作業:
...
label_1:
cmp dword [ecx], 0
je label_6
; ---- P UP ----
add ecx, 4
; ---- ADD ----
add dword [ecx], 15
; ---- p DOWN ----
sub ecx, 4
; ---- SUB ----
sub dword [ecx], 1
jmp label_1
label_6: ; ---- P UP ----
add ecx, 4
...
旁注:
- 您不需要
cmp dword [ecx], 0,因為sub dword [ecx], 1已經設定了零標志,由je label_6. 前面的add dword [ecx], 8設定 ZF=0 所以沒問題。 - 您的最終
exit系統呼叫以錯誤的回傳碼退出,您可能希望xor ebx, ebx在int 0x80退出之前使用 code0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418157.html
標籤:
