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

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

作者: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的解法,请大家等待,或者大家研究一下,把解法贴出来,给大家参考哦!

                                                           ----待续

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

相关推荐

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

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

someby的博客 3万+

汇编指令机器码相互转换

信息来源:80x86汇编小站原始连接:http://www.x86asm.com/DisplayArticle.asp?BoardID=3&ArticleID=32文章作者:HSLY作者:HSLY 网站:http://www.x86asm.com E-MAIL: pliceman_110@163.comHI,欢迎进入Assembly Language into Mechine Code 教程。 

|游梦空间| 3947

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

转载——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

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

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

百里杨的博客 6542

X86(32位)汇编指令机器码转换原理

本文属于《》之一,欢迎查看其它文章。在X86 32位架构下,指令格式定义中,新增了SIB字节。SIB(Scale, Index, Base)字节的意义是用于指定一种复杂的寻址方式(按比例变址寻址),在中已经介绍过了。

百里杨的博客 2936

汇编指令机器码

等指令,它们后面都有一个在寄存器或存储器中的字节长的操作数和一个立即数,每条指令使用的操作码都为80。通过汇编和链接,设置改状态位为1,则说明是32位操作数,否则是16位操作数。在16位模式中使用前缀,则会修改为32位,若在32位模式中使用前缀,则会修改为16位,具有反转当前默认操作数大小的作用。reg域要满足有且仅有一个操作数为寄存器或存储器,另外一个操作数必须是立即数。表示该指令是一个寄存器到寄存器的操作,或一个立即数到寄存器的操作。,机器码只有一个字节,这很方便。...

XiaoLing 一直摆烂哇! 5883

如何将机器码转换汇编代码

在linux内核里面有很多脚本工具,位于linux/scripts/。里面有一个decodecode工具可以用来转换机器码,用法如下: 比如有一行armv8的机器码:f2a800e8,将其翻译成汇编。 :$ echo "f2a800e8" > code :$ ./decodecode < code Code starting with the faulting instruction =========================================== 0: f2a8

wujianyongw4的博客 4479

汇编指令机器码对应列表

指令集依照机器操作码、汇编助记符和汇编操作数来描述指令,遵循下列约定: l reg8: 8位寄存器。 l reg16: 16位寄存器。 l mem8: 8位内存数值。 l mem16: 16位内存数值。 l immed8: 8位立即数值。 l immed16: 16位立即数值。 l immed32: 32位立即数值。 l segReg...

weixin_43708844的博客 9254

汇编指令机器码的对应表_一、汇编基础

1、汇编语言的产生早期我们编程是用机器可以执行的机器码编程的,但是这样太复杂,于是人们就想办法,于是汇编语言就产生了。汇编工作过程如下图2、汇编语言的组成汇编语言(1)汇编指令机器码的助记符,有对应的机器码(2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行(3)其他符号:+,-,*,/等,由编译器识别,没有对应的机器码汇编语言的核心是汇编指令,它绝对了汇编语言的特性,就像我们每一种构...

weixin_28756281的博客 4659

计算机结构之X86指令集编码

在学习了解计算机结构时,针对X86指令从汇编码到机器码转换过程详解。除开SUB 操作码针对4Byte立即操作数时,适用Mod R/M 模型来处理;当Src.1 和Src.2都是寄存器时,属于寄存器直接寻址,Mod 为11,此时Reg和R/M的数据要进行互换一下,参考上面的例子;如果是Src.1是寄存器,Src.2表示存储的是地址且无偏移量的情况下,那么就是非直接寻址,Mod 为00,如果在非直接寻址情况下,有偏移量,那么Mod就需要根据偏移量的大小参考表格[2]去选择是01还是10。

weixin_44078173的博客 1837

汇编指令机器码的对应表

一、汇编速查          MOV   AA,BB         将   BB   放到   AA   里          CALL                   调用子程序   (相当于   BASIC   的   GOSUB)          RET     RETF     返回程序       (相当于   BASIC   的   RETURN)       

it技术学习 2万+

【MFC X86常用汇编指令转十六进制机器码

MFC X86常用汇编指令转十六进制机器码 X86常量宏.h #pragma once #define CALL 1 #define RETN 2 #define PUSHAD 3 #define POPAD 4 #define CALLEAX 5 #define CALLECX

lwqamm的博客 2977
上一篇: Bjarne Stroustrup言论翻译
下一篇: ML.EXE常用汇编器参数
mmstnet
博客等级 码龄19年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值