【问题标题】:is there a difference between al and dl? [duplicate]al和dl有区别吗? [复制]
【发布时间】:2020-07-13 13:34:51
【问题描述】:

首先,这是我的第一次组装。我将它与“NASM”、“64bit 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 之间的区别。

有人知道吗?谢谢。

【问题讨论】:

  • al 是您用于寻址的rax 的低字节。

标签: macos assembly x86-64 nasm


【解决方案1】:

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 不会受到影响,因此您的程序可以按预期运行。

试试下面的代码,通过调试器运行,看看在`rax上改变al的值的效果:

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

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2014-09-24
    • 2016-11-15
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多