assembly - 如何在 NASM 中为 x86 程序集上的 `ADD r/m16, imm16` 生成匹配 `81 /0 iw` 的输出?
问题描述
我正在阅读 x86 Intel 文档上的ADD指令,一次一行,并尝试重现它,以便我可以了解它们晦涩的符号是如何工作的,并弄清楚如何在没有 gcc/clang/llvm/等的情况下生成机器代码。
我目前被困在81
操作码对上:
81 /0 iw ADD r/m16, imm16 MI Valid Valid Add imm16 to r/m16.
81 /0 id ADD r/m32, imm32 MI Valid Valid Add imm32 to r/m32.
NASM 指令调用的两个示例(每个示例一个)将生成与这些模式匹配的输出并从每个示例开始生成输出81
?
当我尝试我认为可行的方法时,我会得到完全不同的输出:
add ax, 6553
变成:
66 05 99 19
由此:
bits 64
global start
section .text
start:
ADD ax, 6553
和
nasm -f macho64 test.asm
我可以让83
那些工作,比如:
83 /0 ib ADD r/m16, imm8
像这样工作:
bits 16
global start
section .text
start:
add ax, 1
但是 81 不起作用,它只是不同imm16
,我不明白。
解决方案
它在开头的某处提到:66
前缀在 16 位和 32 位操作数大小之间切换。在 16 位模式下,16 位操作数大小是默认值。在 32 位和 64 位模式下,32 位是默认操作数大小。由于指令列表适用于所有操作模式(除非另有说明),它不显示66
前缀的使用位置,因为它始终以相同的方式用于标量指令(但要注意前缀用于不同的 SSE 指令目的)。
关于您的add ax, 6553
指令:汇编程序在此处选择较短的add ax, imm16
编码。选择不同的寄存器ax
来避免这种影响。
也许尝试
add cx, 1234
add ecx, 1234
也许是为了更好的衡量
add rcx, 1234
推荐阅读
- php - 连接到 Cloud Datastore 时出现致命错误代码 401
- sql - 消息 240,锚点和列中的递归部分之间的类型不匹配
- java - 为什么我编码错误,geotools create shapefile chinese setAttribute error
- kotlin - 通过 vert.x 发送文件作为响应的表达式的名称是什么
- python - 如何消除导入文本的一部分
- reactjs - 导入默认导出未定义
- symfony - Symfony 4登录表单:认证成功,但重定向后认证立即丢失
- .net - 安装 Windows 服务时 Topshelf 抛出错误
- c++ - 为什么擦除命令会结束我的 while 循环?
- installation - 黑板安装