我在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
答案 0 :(得分:3)
是和否。你的例子相当差,因为它交换了寄存器的含义(交换ECX
和EDX
中的值)。 Linux内核要求输入位于寄存器EBX
(第一个参数),ECX
(第二个)和EDX
(第三个)中。因此,如果您在ECX
和EDX
中交换值,则实际上是在更改参数顺序,告诉系统调用错误的信息,并且您无疑会得到错误的结果。
相反,如果你只是简单地将数据移动到寄存器中的顺序,那么什么都不会改变。您可以按照您想要的顺序将数据移动到寄存器中。