在x86-64 Tour of Intel Manuals中,我读到了
也许最令人惊讶的事实是,诸如
MOV EAX, EBX自动将指令的高32位归零的指令RAX.
同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们:
- 64位操作数在目标通用寄存器中生成64位结果.
- 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果.
- 8位和16位操作数生成8位或16位结果.目标通用寄存器的高56位或48位(分别)不会被操作修改.如果8位或16位操作的结果用于64位地址计算,则将寄存器显式符号扩展为完整的64位.
在x86-32和x86-64汇编中,16位指令如
mov ax, bx
Run Code Online (Sandbox Code Playgroud)
不要表现出这种"奇怪"的行为,即eax的上层词被归零.
因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖).
%AX = (%AH + %AL)
那么为什么不%EAX = (%SOME_REGISTER + %AX)注册%SOME_REGISTER呢?
正如标题所述,为什么人们会使用"movl $ 1,%eax"而不是"movb $ 1,%eax",我被告知movl会将%eax的高阶位清零,但不是%eax一个相当于系统字大小的寄存器?意思是movl实际上是一个整数运算(而不是长整数?)
我显然对这一切感到困惑; 谢谢.
write(1,"hi",3)在linux上反汇编,gcc -s -nostdlib -nostartfiles -O3结果如下:
ba03000000 mov edx, 3 ; thanks for the correction jester!
bf01000000 mov edi, 1
31c0 xor eax, eax
e9d8ffffff jmp loc.imp.write
Run Code Online (Sandbox Code Playgroud)
我不是到编译器的开发,但由于移动到这些寄存器的每一个值是恒定的和已知的编译时间,我很好奇,为什么不GCC使用dl,dil和al来代替.也许有人会说,此功能不会让任何性能上的差异,但有一个在之间的可执行文件的大小有很大的区别mov $1, %rax => b801000000,并mov $1, %al => b001当我们谈论数千寄存器的程序访问.如果软件的优雅部分不仅体积小,它确实会对性能产生影响.
有人可以解释为什么"海湾合作委员会决定"它无所谓?
32位寄存器名称以E开头,64位寄存器以R开头.E和R代表什么?是否有理由选择这些字母?
此外,在64位寄存器中,我们也可以在任何低级调试器(如Windbg)中看到,最右边的位仍然用与64位寄存器相同的名称引用,除了名称以E.例如,64位系统中RAX寄存器的最右边32位称为EAX.
那么,E和R代表什么?而且,为什么后缀X用于注册?
首先,什么尺寸eax,ax,ah和同行,在64位架构?如何访问单个寄存器的字节以及如何访问所有64位寄存器的8个字节?
我非常喜欢x86-64(x64)和Itanium处理器.
第二,在新的调用约定中,使用四个寄存器来保存函数调用中前四个参数的正确方法是什么?
为什么没有特定的寄存器来访问寄存器的其他部分(16-32)?
像啊或al一样访问ax寄存器的8位部分.

在这里,我尝试了一些方法来打印 10 到 0 的十进制数字emu8086。
.MODEL SMALL
.STACK 100H
.DATA
NUM DB 58D
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
START:
CMP NUM,48D
JGE PRINT
JMP END_
PRINT:
MOV AH,2
MOV DL,NUM
INT 21H
DEC NUM
JMP START
END_:
MOV AH,4CH
MAIN ENDP
END MAIN
Run Code Online (Sandbox Code Playgroud)
它在打印 9 到 0 时工作得很好,但它不是打印 10 而是打印asciivalue 的字符10d。我是 .so 的新手,assembly language如何打印 0 到 100 个十进制数字?
假设我们在EAX寄存器中保存数字1,并将最高有效字节与最低有效字节交换.新交换的数字是256还是16777216?
我在汇编程序中通过交换AL-的值和AH-Register的值来尝试它.我的结果是256.我不认为这是正确的,我也不理解256的结果.我认为EAX寄存器是32位,而不是16位.
该问题与交换的正确结果有关.
我对x86汇编中的32位寄存器的子部分有疑问:是否将寄存器(使用时)的下部子部分视作相应的32位寄存器的一部分?
ror cl,2 ror cl,2 推ecx 流行曲
以上面的代码部分为例-由于CL是ECX寄存器的子部分,当我将寄存器的内容压入堆栈时,子部分中的内容也被CL压入堆栈了吗?还是分开对待?
并假设如果我然后将堆栈弹出到EAX寄存器中,那么进入CL寄存器之前,寄存器中的内容是什么EAX?