首页 > 解决方案 > (程序集)试图将数据加载到不适合它的寄存器的行为?

问题描述

我现在正在学习汇编,只是想知道是否有人可以澄清尝试将数据移动到不适合它的寄存器中的行为。

例如,假设我们有(在 x86 上,AT&T 语法):

movl $0xff00abcd, %ax

其中 %ax 是 %eax 的 16 位子寄存器,会发生什么?指令会完全失败,还是 %ax 包含 $0xff00?

标签: assemblyx86att

解决方案


这样的指令是不可编码的:根本没有机器代码的字节序列可以告诉 CPU 将值移动0xff00abcdax. (为什么架构设计者应该指定任何字节序列来告诉 CPU 这样做,而这显然是不可能的?)。所以不可能执行这样的指令,因为它不存在。

那么,当被要求汇编一条不存在的指令时,您的汇编器会怎么做呢?当然,它应该警告你。接下来它会做什么取决于你的汇编器是如何设计的。一些汇编程序可能只是将其作为致命错误并拒绝继续,直到您修复它。其他人可能会为某些不同的指令发出机器代码,希望这可能是您的意思。

与在许多其他情况下处理溢出的方式相匹配,gas 显然所做的是截断高位并发出movw $0xabcd, %ax. 但是,依赖这种行为并不是一个好主意。


推荐阅读