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
有效以及 al
和 dl
之间的区别。
有人知道吗?谢谢。
al
是rax
的最小部分,而dl
是rdx
的最小部分。更改 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
。
首先,这是我的第一次组装。我将它与“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
有效以及 al
和 dl
之间的区别。
有人知道吗?谢谢。
al
是rax
的最小部分,而dl
是rdx
的最小部分。更改 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
。