汇编指令与机器码的相互转换

汇编代码转成机器码mips-code-to-machine-code 汇编代码转成机器码——对输入有几点要求:指令是小写;一行只能有一条指令;每行开头不能有空格,必须一上来就是操作符,后面可以有空格;立即数只处理十进制数;输入-1代表程序结束 立即下载

信息来源:80x86汇编小站
原始连接:http://www.x86asm.com/DisplayArticle.asp?BoardID=3&ArticleID=32
文章作者:HSLY


作者:HSLY 网站:http://www.x86asm.com E-MAIL: pliceman_110@163.com

HI,欢迎进入Assembly Language into Mechine Code 教程。

  首先你得从80x86汇编小站下载<Intel 80x86 OPCODES手册>
  下载地址:Soft_Show.asp?SoftID=8
 
  机器语言我们只要重点理解一下几个概念:
 
  1. 机器语言指令有操作码(OP)和地址码两部分组成

                 
    |_____________OP_______________|__d__|__w__|

    |_____________OP_______________|__s__|__w__| <--此格式用于立即寻址方式


  在多数操作码中,常使用某些位来指示某些信息:
  如图上结构里的: w=1 时 对字来操作
              w=0 时 对字节来操作

              d值在双操作数指令中才有效
            当 d=1 时 有且只有一个寄存器用于目的操作数
              d=0 时 有且只有一个寄存器用于源操作数

              s=1 时 立即数为8位,但要求扩展成16位数
              s=0 时 当指令作字节操作/有16位立即数

由于汇编的指令格式很多,这里我只作一些基本情况介绍,必要时读者可以下载/查阅80x86汇编小站http://www.x86asm.com提供的OPCODES手册来查阅。

  2. 寻址方式的机器语言表示:

    |   mod   |     reg     |   r/m   |
    |_____|_____|_____|_____|_____|_____|_____|

  reg 表示寄存器方式,在不包括立即数的双操作数指令的情况下,规定必须有一个操作数在寄存器中,该寄存器由reg字段指定,并与操作码字节中的w位相组合确定的寄存器

  mod字段与r/m(register/memory)字段结合在一起确定另一个操作数的寻址方式现在你们下载了80x86汇编小站(http://www.x86asm.com)提供的OPCODES 手册了吗?
下载好了,请解压后打开里面的:opcodes.html 文件,然后熟悉里面的表格:

现在熟悉简单的:
______________________________________________________________________________
表1 <PS:部分资料>     rrr : W=0 : W=1 : reg32

                000 : AL : AX : EAX

                001 : CL : CX : ECX

                010 : DL : DX : EDX

                011 : BL : BX : EBX

                100 : AH : SP : ESP

                101 : CH : BP : EBP

                110 : DH : SI : ESI

                111 : BH : DI : EDI
______________________________________________________________________________
表2 <PS:部分资料>     rrr : Index Register
                000 : EAX

                001 : ECX

                010 : EDX

                011 : EBX

                100 : No Index

                101 : EBP

                110 : ESI

                111 : EDI
______________________________________________________________________________
表3 <PS:部分资料>     mmm : Function         11
                                      w=1
                000 : DS:[BX+SI]      

                001 : DS:[BX+DI]

                010 : SS:[BP+SI]

                011 : SS:[BP+DI]             BX          

                100 : DS:[SI]

                101 : DS:[DI]

                110 : SS:[BP]

                111 : DS:[BX]
______________________________________________________________________________
表4 <PS:部分资料>
oo : Function

00 : If mmm = 110, then a displacement follows the operation; otherwise, no displacement is used

01 : An 8-bit signed displacement follows the opcode

10 : A 16-bit signed displacement follows the opcode

11 : mmm specifies a register, instead of an addressing mode
______________________________________________________________________________
上面的表,你都看明白了吗? 现在我就教你们如何利用这样的表格来把汇编指令翻译机器码

  3.指令格式简介

  8086所用的16位指令格式:

  ________   _____________   ________   ________
  |操作码| + |mod-reg-r/m| + |位移量| + |立即数|
  1~2字节   0~1字节       0~2字节   0~2字节


OK!以上就是基本知识,下面我们来实践吧:

———————————————————————————————————————
问题:

  MOV AX,1234H 对应的机器码为:B83412

  MOV EBX,0   对应的机器码为:66BB00000000

  MOV CL,55H   对应的机器码为: B155

  MOV AX,BX   对应的机器码为:8BC3


  我在问一下,机器码的数据格式是什么? 好像是 机器指令+操作数(高位存放在地址高位,低位存放在地址低位),但是前面MOV AX,怎么就变成了B8,弄不明白,请指教。

PS: 上面的题目是一个网友问的,现在我来实践一遍给你们看。
———————————————————————————————————————

指令1 -> MOV AX,1234H 对应的机器码为:B83412

解法: 判断-> 这个是8086汇编16位汇编指令格式,并且是立即寻址方式
    查表-> 打开opcodes.html文件,找到标题为“Main Instructions”,单击“M”字母,然后对应查看 “MOV Reg,Imm”格式的“OpCode”项为:1011wrrr
  再判断-> 由于寄存器是AX, 立即数是1234H,明显是“对字操作”,所以w=1
          在查看本文章上面的“表1”,对应的查到rrr的值为000
  组合结果-> w=1
          rrr=000
          1011wrrr=1011 1000B ->B8H              
根据“ 3.指令格式简介” -> B8H + |立即数(低位在前高位在后)|= B83412H

PS: "+" 符号不为“加号”

好了,已经解完第一题了,机器码为 B83412H  

———————————————————————————————————————

指令4 -> MOV AX,BX   对应的机器码为:8BC3

解法: 判断-> 这个是8086汇编16位汇编指令格式,并且是寄存器寻址方式
    查表-> 打开opcodes.html文件,找到标题为“Main Instructions”,单击“M

”字母,然后对应查看 “MOV Reg,Reg”格式的“OpCode”项为:1000101woorrrmmm
  再判断-> 由于寄存器是AX, BX 明显是“对字操作”,所以w=1
          在查看本文章上面的“表4”,对应查到oo=11 因为是寄存器寻址方式
          在查看本文章上面的“表1”,对应查到rrr的值为000 ,因为当两个操

作数都是寄存器,那么一般要以目的操作数为准
          在查看本文章上面的“表3”, 对应查到mmm的值为011 ,因为当两个操作数都是寄存器,那么一般要以源操作数为准
  组合结果-> w=1
          oo=11
        rrr=000
        mmm=011
1000101woorrrmmm=1000 1011 1100 0011B ->8BC3H

好了,已经解完第二题了,机器码为8BC3H
———————————————————————————————————————

呵呵,不错吧,很简单吧,有了80X86 OPCODES 查询表一切都是那么简单,如果还有什么问题,大家都来这里提问!

剩下的:

指令2 -> MOV EBX,0   对应的机器码为:66BB00000000

指令3 -> MOV CL,55H   对应的机器码为: B155

大家来练练手,注意指令2 需要用到32位指令格式,请查阅相关的80x86汇编语言书籍的机器语言部分,应该有解释的。

指令2的解法,请大家等待,或者大家研究一下,把解法贴出来,给大家参考哦!

                                      ----待续
                                      2004   2月14日

x86/x64软件逆向分析【提高篇】 本课程为《x86/x64软件逆向分析》系列课程之“提高篇”,在“入门篇”的基础上,补充了更多深入和复杂的逆向分析内容。本课程可以作为逆向工程师的参考教程,也可以作为对软件逆向分析充满兴趣的朋友们的“提高”教程。 如果你看到某个exe程序能够实现某种特殊的功能,但你却不知道如何实现,这时候,你通过反汇编、反编译和动态跟踪等方法分析出其具体的实现过程,进而“参考”这个过程自己实现这个特殊的功能,这种行为就是逆向工程。逆向不仅仅是反编译,而且还要推倒出设计,并且能够文档化,从而使软件得以更好的维护。 在工作中,发现现用软件中有BUG,但软件开发商已经不存在了,怎么办?掌握软件逆向分析技术,给它“修”一下。 传说中的神秘的“黑客”、“大神”,无非是掌握了你还没掌握的某些技能而已,知道了你所不知道的某些特殊知识而已。掌握《x86/x64软件逆向分析》,你离这些神秘的“黑客”、“大神”只有一步之遥。 “天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣!” 逆向分析,如同玩猜谜游戏,当你看到一个个谜底慢慢浮现的时候,只有身在其中的人,才能享受其中的刺激和乐趣。作为看客,永远无缘体验这份乐趣。 阅读详情

相关推荐

汇编指令机器码在线转换工具

汇编指令机器码在线转换工具

someby的博客 3万+

8086(16位)汇编指令机器码转换原理

在上一节,我们讲了X86指令基本格式。在8086架构下,是不存在SIB字节的,因此,我们重点关注ModR/M。

百里杨的博客 6541

X64(64位)汇编指令机器码转换原理

REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。第二步,以寄存器操作数,反推ModRM.regREX.R。

百里杨的博客 7176

汇编指令机器码相互转换

机器语言我们只要重点理解一下几个概念:1. 机器语言指令有操作码(OP)和地址码两部分组成 |_____________OP_______________|__d__|__w__||_____________OP_______________|__s__|__w__| 在多数操作码中,常使用某些位来指示某些信息:如图上结构里的: w=1 时 对字来操作w=0 时 对字节来操作d

jiangyuanfu的专栏 2055

汇编指令机器码相互转换【转】

机器语言我们只要重点理解一下几个概念:1. 机器语言指令有操作码(OP)和地址码两部分组成机器语言我们只要重点理解一下几个概念:1. 机器语言指令有操作码(OP)和地址码两部分组成|_____________OP_______________|__d__|__w__||_____________OP_______________|__s__|__w__| &lt;--此格式用于立即寻址方式在多数操...

p312011150的博客 2万+

转载——8086汇编指令机器码相互转换

汇编指令机器码相互转换 贴子发表于:2008-10-28 12:48:03 机器语言我们只要重点理解一下几个概念:1. 机器语言指令有操作码(OP)和地址码两部分组成 |_____________OP_______________|__d__|__w__||_____________OP_______________|__s__|__w__| 在多数操作码中,常使用某些位来

gooogleman#foxmail.com 4926

【转】汇编指令机器码相互转换

80x86 opcodes : http://www.aogosoft.com/download/opcodes.rar

okmnji79513的专栏 1130

汇编指令机器码相互转换(来自80x86汇编小站)

作者:HSLY  网站:http://www.x86asm.com  E-MAIL: pliceman_110@163.comHI,欢迎进入Assembly Language into Mechine Code 教程。首先你得从80x86汇编小站下载下载地址:Soft_Show.asp?SoftID=8   机器语言我们只要重点理解一下几个概念:      1. 机器语言指令有

MmstZCC(安然)的专栏 1万+

汇编学习之《工具安装和进制学习》

ollyDbg 一款免费使用的软件,用于查看我们的执行程序。本软件作者是 Oleh Yuschuk(解压下载的文件就可以运行,我电脑上开始运行的时候提示到有的库比系统中的版本低了,我们选择是就可以。另外会提醒如下,我们选择设置管理员权限运行就可以了。我简单描述下设置快捷方式发送快捷方式: 右键-点击属性-发送桌面快捷方式。设置管理员运行: 右键桌面快捷方式-选择顶部快捷方式-选择高级-选择用管理员身份运行(R)-确认-确认-再次运行OK.

u011374344的专栏 1142

汇编语言 指令 机器码三者的关系

简单说就是同一操作的三种不同表示方法 机器码是0和1组成的二进制序列,可读性极差 指令就是把特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好 汇编语言包括指令和伪指令。伪指令是为了编程方便,对部分指令做的封装。 汇编指令机器码相互转换: 机器语言我们只要重点理解一下几个概念: 1. 机器语言指令有操作码(OP)和地址码两部分组成 机

xiaofei0859的专栏 1万+

汇编指令机器码的对应表

原文地址::http://blog.csdn.net/cyg0810/article/details/7794849 相关文章 1、汇编对应机器码大全----http://wenku.baidu.com/link?url=GeRgqDNM40TlJtIz2RCWGd8o1uCeLCT_ZJ3d4wNA_ZQm_7uGcJ7YF3JKV8_lyFNYoRIYs3ue7-8

xqhrs232的专栏 1万+

机器码、字节码、汇编语言的区别

机器码 机器码(machine code),机器语言指令,一种CPU的可读指令,是CPU可直接解读的0 1二进制序列。不同的CPU生产厂商,遵守的机器指令标准主体上是通用的,但也会有自己的一些比较特殊的指令。 字节码 字节码(Bytecode),是一种包含执行程序、由一序列 op(操作码)代码/数据对组成的二进制文件,字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码,是一种要解释的虚拟机的指令,并且仍然需要在执行之前转换为机器代码。 java文件经过javac编译器编译生成的.

chenke890703的博客 6240

Deno ext/crypto 源码走读:Web Crypto API 的 Rust 化分派 cppgc 密钥句柄

[README](https://link.gitcode.com/i/d0e0887bc5057e7bfd68147108953f41) 的 "Surface" 一节断言 "There are no standalone ops",可 [lib.rs](https://link.gitcode.com/i/0eefa5b9058d8b7ea4c50d11207424fe) 的扩展宏里实际仍注册着

gitblog_00420的博客 771

程序-从字符到机器码

计算机是依靠一系列的约定和规则,使得软硬件能够协同工作,完成各种复杂的任务。这些约定和规则是不断发展和完善的,它们不是死板的,而是随着技术的进步和应用场景的变化而不断演化。进程管理和CPU调度是操作系统的两个重要组成部分,它们共同协作,以实现程序运行的效率最大化。

nameless_233的博客 356
上一篇: 远离尘嚣
下一篇: debug详解
codeshell
博客等级 码龄21年 9粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值