首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NASM16位模式下的‘`add cx,1234`会产生带有objdump的<unknown>?

为什么NASM16位模式下的‘`add cx,1234`会产生带有objdump的<unknown>?
EN

Stack Overflow用户
提问于 2021-01-29 11:42:23
回答 1查看 36关注 0票数 0

我有这个:

代码语言:javascript
复制
bits 16
global start
section .text
start:
  add cx, 1234

使用这个Makefile:

代码语言:javascript
复制
test:
    @nasm -f macho64 test.asm
    @objdump -x86-asm-syntax=intel --full-leading-addr -d test.o
.PHONY: test

它打印:

代码语言:javascript
复制
% make

test.o: file format Mach-O 64-bit x86-64


Disassembly of section __TEXT,__text:

0000000000000000 start:
      0: 81 c1                          <unknown>
      2: d2 04                          <unknown>

为什么它会生成<unknown>,而不在这里显示指令?我做错什么了吗?我还在学习机器代码的基础知识,如果很明显的话,很抱歉。

它在32位模式下似乎工作得很好:

代码语言:javascript
复制
bits 32
global start
section .text
start:
  add cx, 1234

输出:

代码语言:javascript
复制
% make

test.o: file format Mach-O 64-bit x86-64


Disassembly of section __TEXT,__text:

0000000000000000 start:
      0: 66 81 c1 d2 04                 add cx, 1234
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-29 12:13:14

64位模式下的操作码81需要更多5个字节(modrm + imm32),但是您的.text段在此之前结束,所以反汇编程序放弃了。如果你用更多的字节填充文本部分(比如times 10 db 0),你会得到一些东西。

您使用bits 16将非64位机器码放入64位目标文件中,因此,您当然应该预料到通常会出现错误。

16位模式的默认操作数大小(16)不同于32和64位模式的默认操作数大小(32),因此66操作数大小前缀与之相反。在32位或64位模式(如add cx, 1234)中需要66前缀的指令要求在16位模式中不存在该前缀。(正如您上一个问题的@fuz's answer中所述)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65948483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档