操作码的十六进制值
Posted
技术标签:
【中文标题】操作码的十六进制值【英文标题】:hexadecimal value of opcodes 【发布时间】:2014-05-18 04:02:11 【问题描述】:我创建了一个非常简单的汇编程序,可以在 DOS 中打印字母“a”。 我在十六进制编辑器中打开它,结果是这样的:
汇编代码:
mov ah, 2
mov dx, 'a'
int 21h
十六进制代码
B4 02 B2 61 CD 21
我想了解它是如何生成的!就像,我不知道我是否正确,但我意识到:
B4 = mov ah
02 = 2
B2 = mov dx
61 = 'a'
CD = int
21h = 21
02
、61
和 21
我明白发生了什么,但是 B4
、B2
和 CD
?
【问题讨论】:
官方文档:intel.com/content/www/us/en/processors/… 如果您只对“指令操作码”感兴趣,那么在之前链接的站点上,不同指令编码成的字节以该文档开头:“手册卷 2A:指令集参考,AM”下面的答案链接的站点 (ref.x86asm.net/coder32.html) 是对英特尔 PDF 的非常好的总结/概述,但请阅读英特尔文档以了解指令的确切行为。 顺便说一句,如果您正在考虑使用汇编,也许还有反汇编/逆向工程,那么请尝试有史以来最好的反汇编/调试器,它有一个免费版本(5.0),它知道的要少得多较新的版本,但即使是这个旧的免费版本也可以击败任何其他解决方案:hex-rays.com/products/ida/support/download_freeware.shtml 它可以方便地分析内容。 【参考方案1】:这是一个很好的参考:http://ref.x86asm.net/coder32.html
如你所见:
CD
是 int
的操作码
B0+reg
是mov reg, imm8
的操作码,其中reg
是目标寄存器,您可以从this table、ah = 100b
和dx = 010b
中看到
【讨论】:
因为有 16 个通用寄存器,所以需要 4 位来对它们进行编码。不是吗? 在您提供的参考资料中,他们给出了操作码和等效的十六进制值。但我不明白如何将它们结合起来以获得有效的指令。例如,0x817 对应 cmp,0x5 对应 reg ebp。但是有了这些信息,我如何编码cmp dword [ebp-4] 2
。我已经通过互联网搜索了大约 2 小时。帮帮我!!【参考方案2】:
是汇编 x86 指令:
B4: mov ah 意思是移入寄存器啊 B2: mov dx 表示在寄存器 dx 中移动 CD:int 表示软件中断我建议您阅读本指南汇编 x86 http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
【讨论】:
以上是关于操作码的十六进制值的主要内容,如果未能解决你的问题,请参考以下文章