cpu寄存器命令在汇编中是否重要?

时间:2015-10-10 20:53:13

标签: linux assembly system-calls 32-bit

我在Linux 32bit学习汇编。 下面的代码将大写字符串转换为小写字母。

当我改变mov指令中寄存器的顺序时,我有这个奇怪的结果。 例如,如果我在这些指令中交换寄存器名称,则输出消失。

mov ecx, msg         
mov edx, msglen

如果改为

,它就不起作用
mov edx, msg 
mov ecx, msglen 

因此必须按此顺序设置寄存器eax ebx ecx edx ...我很困惑(noob)
   - 这是有效的代码

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 

1 个答案:

答案 0 :(得分:3)

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

相反,如果你只是简单地将数据移动到寄存器中的顺序,那么什么都不会改变。您可以按照您想要的顺序将数据移动到寄存器中。