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 

是也不是。你的例子相当糟糕,因为它交换了寄存器的含义(交换 ECXEDX 中的值)。 Linux 内核要求输入位于寄存器 EBX(第一个参数)、ECX(第二个)和 EDX(第三个)中。因此,如果你交换ECXEDX中的值,实际上是在改变参数顺序,告诉系统调用错误的信息,你肯定会得到错误的结果。

相反,如果您只是简单地交换了将数据移入寄存器的顺序,则什么都不会改变。您可以按任意顺序将数据移入寄存器。