程序集 NASM x64 JMP 未按预期工作
Assembly NASM x64 JMP not working as intended
我有以下代码:
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
它打印一个字符,但是当我在 label_6
上方添加 jmp label_1
一行时,它不打印任何内容。它应该打印 char x
(8 * 15 = 120)。有什么变化吗 ecx
?
您的内存访问重叠:dword
是 4 个字节,但您正在执行 add ecx, 2
和 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
系统调用正在退出,并带有错误的 return 代码,您可能希望 xor ebx, ebx
在 int 0x80
之前以代码 0
退出。
我有以下代码:
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
它打印一个字符,但是当我在 label_6
上方添加 jmp label_1
一行时,它不打印任何内容。它应该打印 char x
(8 * 15 = 120)。有什么变化吗 ecx
?
您的内存访问重叠:dword
是 4 个字节,但您正在执行 add ecx, 2
和 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
系统调用正在退出,并带有错误的 return 代码,您可能希望xor ebx, ebx
在int 0x80
之前以代码0
退出。