程序集 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, 2sub 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, ebxint 0x80 之前以代码 0 退出。