我现在正在学习汇编,只是想知道是否有人可以澄清尝试将数据移动到无法容纳它的寄存器中的行为。
例如,假设我们有(在 x86 上,AT&T 语法):
movl $0xff00abcd, %ax
Run Code Online (Sandbox Code Playgroud)
其中 %ax 是 %eax 的 16 位子寄存器,会发生什么?指令会完全失败,还是 %ax 会包含 $0xff00?
这样的指令是不可编码的:根本就没有机器代码字节序列可以告诉 CPU 将值0xff00abcd
移入ax
. (为什么架构设计者要指定任何字节序列来告诉 CPU 这样做,而这显然是不可能的?)。所以不可能执行这样的指令,因为它不存在。
那么当你的汇编器被要求汇编一条不存在的指令时,你会怎么做?当然,它应该警告你。它接下来做什么取决于你的汇编器是如何设计的。一些组装者可能只是把它当作一个致命的错误,并在你修复它之前拒绝继续。其他人可能会发出一些不同指令的机器代码,希望它可能是你的意思。
与在许多其他情况下处理溢出的方式相匹配,gas 显然所做的是截断高位并为movw $0xabcd, %ax
. 不过,依赖这种行为并不是一个好主意。
归档时间: |
|
查看次数: |
103 次 |
最近记录: |