gpt4 book ai didi

linux - cpu 注册顺序在汇编中重要吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:33 34 4
gpt4 key购买 nike

我正在学习 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中的值,你实际上是在改变参数顺序,告诉系统调用错误的信息,你无疑会得到一个错误结果。

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

关于linux - cpu 注册顺序在汇编中重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33058873/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com