al和dl有区别吗?

is there a difference between al and dl?

首先,这是我的第一次组装。我将它与“NASM”、“64 位 ASM”和“Intel”代码以及 Mac OS.

一起使用

当我尝试编写 strdup 函数时,它不适用于 al.

在使用我的 strdup 函数时,字符串被破坏了。

所以,我的代码在这里。

    global _strdup
    extern _malloc

    section .text
_strdup:
    xor rcx, rcx
    jmp strlen
strlen:
    cmp [rdi + rcx], byte 0
    je malloc
    inc rcx
    jmp strlen
malloc:
    inc rcx
    push rdi
    mov rdi, rcx
    call _malloc
    pop rdi
    cmp rax, 0
    je error
    xor rcx, rcx
    jmp copy
copy:   
    mov al, byte [rdi + rcx]
    mov byte [rax + rcx], al
    cmp al, byte 0
    je return
    jmp increment
increment:
    inc rcx
    jmp copy
error:  
    mov rax, 0
    ret
return: 
    ret

但是,当我用 dl 而不是 al 编写相同的代码时,它起作用了!

    global _strdup
    extern _malloc

    section .text
_strdup:
    xor rcx, rcx
    jmp strlen
strlen:
    cmp [rdi + rcx], byte 0
    je malloc
    inc rcx
    jmp strlen
malloc:
    inc rcx
    push rdi
    mov rdi, rcx
    call _malloc
    pop rdi
    cmp rax, 0
    je error
    xor rcx, rcx
    jmp copy
copy:   
    mov dl, byte [rdi + rcx]
    mov byte [rax + rcx], dl
    cmp dl, byte 0
    je return
    jmp increment
increment:
    inc rcx
    jmp copy
error:  
    mov rax, 0
    ret
return: 
    ret

我不知道为什么 dl 有效以及 aldl 之间的区别。

有人知道吗?谢谢。

alrax的最小部分,而dlrdx的最小部分。更改 al 也会更改 rax 的值。

为什么您的代码不适用于 al

copy:   
    mov al, byte [rdi + rcx] ; you move "byte [rdi + rcx]" in "al"
                             ; thus changing the value of "rax" as well.
                             ; the result of the following statement becomes unexpected
    mov byte [rax + rcx], al

但是当您使用 dl 执行此操作时,rax 不会受到影响,因此您的程序会按预期运行。

尝试下面的代码并运行它通过调试器来查看改变al值对`rax:

的影响
section .text
    global main
main:
    nop

    mov rax, 1000
    mov al, byte 10

    nop

结果:

mov rax, 1000之后,rax的值:1000

00000000 00000000 00000000 00000000 00000000 00000000  00000011 11101000

mov al, 10之后,rax的值:778

00000000 00000000 00000000 00000000 00000000 00000000  00000011 00001010
                                                                ^^^^^^^^   

因此,更改 al 将影响 rax