assembly - (程序集)试图将数据加载到不适合它的寄存器的行为?
问题描述
我现在正在学习汇编,只是想知道是否有人可以澄清尝试将数据移动到不适合它的寄存器中的行为。
例如,假设我们有(在 x86 上,AT&T 语法):
movl $0xff00abcd, %ax
其中 %ax 是 %eax 的 16 位子寄存器,会发生什么?指令会完全失败,还是 %ax 包含 $0xff00?
解决方案
这样的指令是不可编码的:根本没有机器代码的字节序列可以告诉 CPU 将值移动0xff00abcd
到ax
. (为什么架构设计者应该指定任何字节序列来告诉 CPU 这样做,而这显然是不可能的?)。所以不可能执行这样的指令,因为它不存在。
那么,当被要求汇编一条不存在的指令时,您的汇编器会怎么做呢?当然,它应该警告你。接下来它会做什么取决于你的汇编器是如何设计的。一些汇编程序可能只是将其作为致命错误并拒绝继续,直到您修复它。其他人可能会为某些不同的指令发出机器代码,希望这可能是您的意思。
与在许多其他情况下处理溢出的方式相匹配,gas 显然所做的是截断高位并发出movw $0xabcd, %ax
. 但是,依赖这种行为并不是一个好主意。
推荐阅读
- php - 包括带有提交表单而不刷新页面的php页面
- django - 内联表单集在保存时返回空列表?
- node.js - 错误:无法加载 gRPC 二进制模块
- c - 遍历转换为 void* 的数组
- android - 当发布数据显示此错误 Android 改造 Expected BEGIN_OBJECT but was STRING
- r - R 连接到 SQL Server
- c# - 在 C# windows 窗体应用程序中获取浏览器的活动 url
- python - 从 `matplotlib.patches.RegularPolygon` 继承在实例化时会产生 `ValueError`
- javascript - 将 Promise.race 与数据数组结合作为参数
- swift - 从字符串创建类类型以作为具体类型传递给泛型参数 Swift