cpu 寄存器顺序在汇编中重要吗?
does the cpu register order matter in assembly?
我正在 Linux 32 位学习汇编。
下面的代码将大写字符串转换为小写 .
当我改变 mov 指令中寄存器的顺序时,我得到了这个奇怪的结果。
例如,如果我在这些指令中交换寄存器名称,输出就会消失。
mov ecx, msg
mov edx, msglen
改成
无效
mov edx, msg
mov ecx, msglen
是否必须按此顺序设置寄存器 eax ebx ecx edx ...我很困惑(菜鸟)
- 这是有效的代码
section .data
msg: db "UPPERCASE", 10 ; string
msglen: equ $-msg ; string length
section .bss
section .text
global _start
_start:
mov ebx, msg
mov eax, 9 ; number of iterations equ number of char in str
doloop:
add byte [ebx], 32 ; label doloop
inc ebx
dec eax
jnz doloop
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msglen
int 80h
mov eax, 1
mov ebx, 0
int 80h
是也不是。你的例子相当糟糕,因为它交换了寄存器的含义(交换 ECX
和 EDX
中的值)。 Linux 内核要求输入位于寄存器 EBX
(第一个参数)、ECX
(第二个)和 EDX
(第三个)中。因此,如果你交换ECX
和EDX
中的值,实际上是在改变参数顺序,告诉系统调用错误的信息,你肯定会得到错误的结果。
相反,如果您只是简单地交换了将数据移入寄存器的顺序,则什么都不会改变。您可以按任意顺序将数据移入寄存器。
我正在 Linux 32 位学习汇编。 下面的代码将大写字符串转换为小写 .
当我改变 mov 指令中寄存器的顺序时,我得到了这个奇怪的结果。 例如,如果我在这些指令中交换寄存器名称,输出就会消失。
mov ecx, msg
mov edx, msglen
改成
无效mov edx, msg
mov ecx, msglen
是否必须按此顺序设置寄存器 eax ebx ecx edx ...我很困惑(菜鸟)
- 这是有效的代码
section .data
msg: db "UPPERCASE", 10 ; string
msglen: equ $-msg ; string length
section .bss
section .text
global _start
_start:
mov ebx, msg
mov eax, 9 ; number of iterations equ number of char in str
doloop:
add byte [ebx], 32 ; label doloop
inc ebx
dec eax
jnz doloop
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msglen
int 80h
mov eax, 1
mov ebx, 0
int 80h
是也不是。你的例子相当糟糕,因为它交换了寄存器的含义(交换 ECX
和 EDX
中的值)。 Linux 内核要求输入位于寄存器 EBX
(第一个参数)、ECX
(第二个)和 EDX
(第三个)中。因此,如果你交换ECX
和EDX
中的值,实际上是在改变参数顺序,告诉系统调用错误的信息,你肯定会得到错误的结果。
相反,如果您只是简单地交换了将数据移入寄存器的顺序,则什么都不会改变。您可以按任意顺序将数据移入寄存器。