操作码的十六进制值

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

026121 我明白发生了什么,但是 B4B2CD

【问题讨论】:

官方文档: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

如你所见:

CDint 的操作码 B0+regmov reg, imm8 的操作码,其中reg 是目标寄存器,您可以从this table、ah = 100bdx = 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

【讨论】:

以上是关于操作码的十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

十进制ASCII码的转换!

http get请求时参数被转码的问题

十六进制和BCD码的区别

8421bcd码转换十进制是多少?

SQL 字符串函数

8421bcd码转换十进制怎么换?