相关疑难解决方法(0)

为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

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汇编的怪癖).

x86 assembly x86-64 cpu-registers zero-extension

97
推荐指数
3
解决办法
2万
查看次数

新的X86_64处理器寄存器的名称是什么?

在哪里可以找到用于此体系结构的新寄存器的名称?

我指的是X86中的寄存​​器,如EAX,ESP,EBX等.但我喜欢它们在64位.

我不认为它们与我拆解C代码时的情况相同,我得到r而不是e.

x86 assembly x86-64 cpu-registers

54
推荐指数
4
解决办法
7万
查看次数

x64和IA-64有什么区别?

我在微软的网站上注意到两个不同的安装程序,一个用于x64,另一个用于IA-64.参考:安装.NET Framework 4.5,4.5.1

我的理解是IA-64是x64的子类,所以我很好奇它为什么会有一个单独的安装程序.如果可能的话,我们将不胜感激.

64-bit x86-64 itanium cpu-architecture

50
推荐指数
4
解决办法
5万
查看次数

什么是被调用者和调用者保存的寄存器?

我在理解调用者和被调用者保存的寄存器之间的区别以及何时使用什么方面遇到了一些麻烦.

我使用的是MSP430:

程序:

mov.w #0,R7 
mov.w #0,R6 
add.w R6,R7 
inc.w R6 
cmp.w R12,R6 
jl l$loop 
mov.w R7,R12
ret
Run Code Online (Sandbox Code Playgroud)

上面的代码是被调用者,并且在教科书示例中使用,因此它遵循惯例.R6和R7被呼叫者保存,R12被呼叫者保存.我的理解是被调用者保存的regs不是"全局的",因为在过程中改变它的值不会影响它在程序之外的值.这就是您必须在开头将新值保存到被调用者注册表中的原因.

R12,保存的来电者是"全球性的",因为缺乏更好的词汇.该程序在通话后对R12产生持久影响.

我的理解是否正确?我错过了其他的东西吗?

assembly abi cpu-registers calling-convention

40
推荐指数
3
解决办法
8万
查看次数

AX,AH,AL如何映射到EAX?

我对x86寄存器的理解表明,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器.

在这个例子中EAX是一个32位寄存器,如果我们调用AX它应该返回前16位,如果我们调用它AHAL它应该返回16位之后的下一个8位并且AL应该返回最后8位.

所以我的问题,因为我不相信这是它的运作方式.如果我们存储一个32位值的七...也就是EAX存储

0000 0100 0000 1000 0110 0000 0000 0111
Run Code Online (Sandbox Code Playgroud)

因此,如果我们访问AX它应该返回

0000 0100 0000 1000
Run Code Online (Sandbox Code Playgroud)

如果我们读AH它应该返回

0000 0100
Run Code Online (Sandbox Code Playgroud)

当我们读到AL它时应该返回

0000 0111
Run Code Online (Sandbox Code Playgroud)

它是否正确?如果它AH真正具有什么价值呢?

x86 assembly cpu-registers

36
推荐指数
4
解决办法
9万
查看次数

英特尔32位和64位寄存器的名称中E和R前缀代表什么?

32位寄存器名称以E开头,64位寄存器以R开头.E和R代表什么?是否有理由选择这些字母?

此外,在64位寄存器中,我们也可以在任何低级调试器(如Windbg)中看到,最右边的位仍然用与64位寄存器相同的名称引用,除了名称以E.例如,64位系统中RAX寄存器的最右边32位称为EAX.

那么,E和R代表什么?而且,为什么后缀X用于注册?

64-bit x86 assembly x86-64 cpu-registers

13
推荐指数
1
解决办法
3294
查看次数