精华内容
下载资源
问答
  • 机器码转换汇编

    热门讨论 2012-07-30 07:39:14
    机器码转换为汇编代码
  • 机器码转汇编

    2020-09-18 11:09:24
    有时候,我们在分析问题的时候,能得到的只有机器码,例如 0f 11 01 4c 03 c1 48 83 c1 10 48 83 e1 f0 4c 2b c1 4d 要分析这段代码,可以找intel的数据手册,然后去解析这句话的意思。不过这样效率太低,我们可以...

    有时候,我们在分析问题的时候,能得到的只有机器码,例如

    0f 11 01 4c 03 c1 48 83 c1 10 48 83 e1 f0 4c 2b c1 4d
    

    要分析这段代码,可以找intel的数据手册,然后去解析这句话的意思。不过这样效率太低,我们可以通过如下方式分析。

    1. 先把机器码写到文件里
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main(void)
    {
        char bin_data[] = {0x0f, 0x11, 0x01, 0x4c, 0x03, 0xc1, 0x48, 0x83, 0xc1, 0x10, 
                            0x48, 0x83, 0xe1, 0xf0, 0x4c, 0x2b, 0xc1, 0x4d};
        int fd = open("1.bin", O_RDWR | O_CREAT);
        if(fd < 0) {
            printf("error opening file\n");
            return 0;
        }
        
        write(fd, bin_data, 18);
        close(fd);
        return 0;
    }
    
    1. 使用objdump进行反汇编
      因为这段机器码是在x86机器上生成的,所以需要指定***-m i386:x86-64***
    objdump -b binary -m i386:x86-64  -D 1.bin
    

    在这里插入图片描述

    展开全文
  • 汇编转换 机器码转汇编

    热门讨论 2011-06-09 02:35:40
    汇编转换工具。机器码转汇编。汇编转字节集
  • 机器码转汇编代码的工具·············································
  • 在用logisim初步画完...但是机器码太抽象,因此使用下面的程序将指令机器码翻译成指令名称,进而继续调试电路。/*32位MIPS指令翻译器输入一条16进制的指令输出该指令的详细信息*/#include#include#include#include...

    在用logisim初步画完CPU电路后,配合educoder调试电路。提交代码到educoder后,后台会检测错误信息,根据报错信息中的周期数或者PC值,可以找到错误的指令机器码。

    但是机器码太抽象,因此使用下面的程序将指令机器码翻译成指令名称,进而继续调试电路。

    /*

    32位MIPS指令翻译器

    输入一条16进制的指令

    输出该指令的详细信息

    */

    #include

    #include

    #include

    #include

    #include

    using namespace std;

    typedef unsigned int IRType;//存储32位指令

    struct INST{

    string name;

    string type;

    string func;

    };

    //24条MIPS指令

    map transTable = {//can not be const

    {"000000000000",{ .name="sll", .type="R", .func="逻辑左移" }},

    {"000000000011",{ .name="sra", .type="R", .func="算术右移" }},

    {"000000000010",{ .name="srl", .type="R", .func="逻辑右移" }},

    {"000000100000",{ .name="add", .type="R", .func="符号加" }},

    {"000000100001",{ .name="addu", .type="R", .func="无符号加" }},

    {"000000100010",{ .name="sub", .type="R", .func="符号减" }},

    {"000000100100",{ .name="and", .type="R", .func="与" }},

    {"000000100101",{ .name="or", .type="R", .func="或" }},

    {"000000100111",{ .name="nor", .type="R", .func="或非" }},

    {"000000101010",{ .name="slt", .type="R", .func="比较大小,小于则寄存器置1(有符号)" }},

    {"000000101011",{ .name="sltu", .type="R", .func="比较大小,小于则寄存器置1(无符号)" }},

    {"000000001000",{ .name="jr", .type="J", .func="跳转至寄存器" }},

    {"000000001100",{ .name="syscall", .type="SYSCALL", .func="系统调用" }},

    {"000010" ,{ .name="j", .type="J", .func="跳转" }},

    {"000011" ,{ .name="jal", .type="J", .func="跳转并链接" }},

    {"000100" ,{ .name="beq", .type="I", .func="相等时跳转" }},

    {"000101" ,{ .name="bne", .type="I", .func="不等时跳转" }},

    {"001000" ,{ .name="addi", .type="I", .func="符号加立即数" }},

    {"001100" ,{ .name="andi", .type="I", .func="与立即数" }},

    {"001001" ,{ .name="addiu", .type="I", .func="无符号立即数加法" }},

    {"001010" ,{ .name="slti", .type="I", .func="比较大小,小于立即数则寄存器置1(有符号)" }},

    {"001101" ,{ .name="ori", .type="I", .func="或立即数" }},

    {"100011" ,{ .name="lw", .type="I", .func="内存加载字到寄存器堆" }},

    {"101011" ,{ .name="sw", .type="I", .func="寄存器存储字到内存" }}

    };

    string HexToBin( string irHex );

    int main()

    {

    string irHex, irBin;

    string opCode, funct;

    cout << "请输入32位16进制指令:(如12200001)" << endl;

    while( cin >> irHex ){

    irBin = HexToBin(irHex);

    cout << "bianry instruction: " << irBin << endl;//test

    opCode = irBin.substr(0,6);//不包括最后一位

    funct = irBin.substr(26,-1);

    if( transTable.find(opCode+funct) != transTable.end() ){

    cout << "name : " << transTable[(opCode+funct)].name << endl;

    cout << "type : " << transTable[(opCode+funct)].type << " | "

    "function : " << transTable[(opCode+funct)].func <

    }

    else if( transTable.find(opCode) != transTable.end() ){

    cout << "name : " << transTable[(opCode)].name << endl;

    cout << "type : " << transTable[(opCode)].type << " | "

    "function : " << transTable[(opCode)].func <

    }

    else{

    cout << "this instruction isn't included." << endl;

    }

    }

    return 0;

    }

    string HexToBin( string irHex )

    {

    const string numbers = "0123456789";

    string irBin;

    IRType irDec = 0;

    for( string::iterator itr = irHex.begin(); itr != irHex.end(); itr++ ){

    irDec *= 16;

    if( numbers.find(*itr) != string::npos ){

    irDec += ( (*itr) - '0' );

    }else{

    ( *itr ) = tolower(*itr);

    irDec += ( (*itr) - 'a' + 10 );

    }

    }

    //cout << irDec << endl;//test

    irBin = 1;

    irBin = bitset((int)irDec).to_string();

    return irBin;

    }

    展开全文
  • 字节集机器码汇编转换计算器 字节集、机器码汇编指令 互相转换工具
  • 比如有一行armv8的机器码:f2a800e8,将其翻译成汇编。 :$ echo "f2a800e8" > code :$ ./decodecode < code Code starting with the faulting instruction =========================================== 0: ...

    在linux内核里面有很多脚本工具,位于linux/scripts/。里面有一个decodecode工具可以用来转换机器码,用法如下:

    比如在arm64机器上有一行armv8的机器码:f2a800e8,将其翻译成汇编。

    :$ echo "Code: f2 a8 00 e8" > code
    :$ ./decodecode < code
    Code starting with the faulting instruction
    ===========================================
    0:   f2a800e8        movk    x8, #0x4007, lsl #16

    注意指令字节之间留一个空格,以“Code:"作为起始,当然这个起始标记一个文件只需一个即可, 比如:

    Code: e8 00 a8 f2 08 00 98 f2 a9 54 eb d2 a9 54 cb f2 a9 54 ab f2 a9 54 8b f2 09 25 81 a8 1f 01 01 eb cb ff ff 54 eb ff ff 17 cc 3e 00 00 00 00 00 00 e5 03 1e aa 00 06 a0 d2 6c 03 00 94 a0 00 5f d6 1f 10 1c d5 00 11 3c d5 00 00 7d b2 00 00 7c b2

    当然脚本认为该机器码是跟host结构相同的原生机器码,想要跨架构的翻译还是不行的。

    展开全文
  • 汇编代码机器码工具,支持CE OD格式显示,汇编转E 汇编转机器码 非常好用的工具。 汇编代码机器码工具,支持CE OD格式显示,汇编转E 汇编转机器码 非常好用的工具。 汇编代码机器码工具,支持CE OD格式...
  • 汇编码转机器码万能转换工具是一款可以将汇编码转成任意机器码的万能汇编码转换器,如果您遇到了多个汇编码需要进行转换,使用这款完全免费的汇编码转机器码万能转换工具一键即可达到目的。 软件特色
  • 本文简单介绍了汇编语言的历史,一个流行的开源汇编软件 NASM,和安装与文本编译器 NotePad++ 的方法。使用 NotePad 写了一个简单的汇编程序,并使用随书工具 HexView 查看。汇编语言简介在前面的章节里,我们讲到了...

    本文简单介绍了汇编语言的历史,一个流行的开源汇编软件 NASM,和安装与文本编译器 NotePad++ 的方法。使用 NotePad 写了一个简单的汇编程序,并使用随书工具 HexView 查看。

    汇编语言简介

    在前面的章节里,我们讲到了处理器,也讲了处理器是如何进行算术逻辑运算的。为了实现自动计算,处理器必须从内存中取得指令,并执行这些指令。

    指令和被指令引用的数据在内存中都是一些或高或低的电平,每一个电平都可以看成是一个二进制位(0 或者 1), 8 个二进制位形成一字节。

    要解读内存中的东西,最好的办法就是将它们按字节转换成数字的形式。比如,下面这些数字就是存放在内存中的 8086 指令,我们用的是十六进制:

    B8 3F 00 01 C3 01 C1

    即使是很有经验的技术人员,要想用这种方式来编写指令,也是很困难的,而且很容易出错。所以,在第一个处理器诞生之后不久,如何使指令的编写变得更容易,就提上了日程。

    为了克服机器指令难以书写和理解的缺点,人们想到可以用一些容易理解和记忆的符号,也就是助记符,来描述指令的功能和操作数的类型,这就产生了汇编语言(Assembly Language)。这样,上面那些指令就可以写成:

    mov ax,3FH

    add bx,ax

    add cx,ax

    对于第一句语句, mov 是 move 的简化形式,意思是“移动”或者“传送”。“ax”,很明显,指的就是 AX 寄存器。传送指令需要两个操作数,分别是目的操作数和源操作数,它们之间要用逗号隔开。在这里, AX 是目的操作数,源操作数是 3FH。

    对于第二句语句,add 的意思是把一个数和另一个数相加。在这里,是把 BX 寄存器的内容和 AX 寄存器的内容相加。相加的结果在 BX 中,但 AX 的内容并不改变。

    有了汇编语言所提供的符号,这只是方便了你自己。相反地,对人类来说通俗易懂的东西,处理器是无法识别的。所以,还需要将汇编语言源程序转换成机器指令,这个过程叫做编译(Compile)。

    从字处理器软件生成的是汇编语言源程序文件。编译软件的任务是读取这些文件,将那些符号转变成二进制形式的机器指令代码。它把这些机器代码存放到另一个文件中,叫做二进制文件或者可执行文件,比如 Windows 里以“.exe”为扩展名的文件,就是可执行文件。当需要用处理器执行的时候,再加载到内存里。

    NASM 编译器

    现存的汇编语言编译器有多种,用得比较多的有 MASM、 FASM、 TASM、 AS86、 GASM等,每种汇编器都有自己的特色和局限性。特别是,有些还需要付费才能使用。不同于前面所列举的这些,在本书中,我们用的是另一款叫做 NASM 的汇编语言编译器。

    NASM 的全称是 Netwide Assembler,它是可免费使用的开源软件。下面是它的下载地址 http://sourceforge.net/projects/nasm/files/

    下载第三方的文本编辑工具

    本文选择使用 NotePas++ 作为文本编辑工具。最新下载链接如下:https://notepad-plus-plus.org/downloads/v7.8.5/

    下载之后,可以通过配置快捷键,将使用 NASM 进行编译用命令行的方式固定下来。在菜单上选择“运行(R)”->“运行(R)”。

    在弹出的窗口内,输入:cmd /k pushd "$(CURRENT_DIRECTORY)" & D:ACERFILESOLDEPROGFILESNASMnasm.exe -f bin "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT 。其中,“D:ACERFILESOLDEPROGFILESNASMnasm.exe”应该改成你自己机器上实际的NASM安装路径

    点击“保存”,然后为这个运行命令起一个名字并分配一个快捷键,这样你下次就可以直接快速执行编译过程。

    测试的汇编程序如下:

    d5cf6c50508c4be7a39883fe629446a3.png

    编译之后,得到 bin 格式的文件。可使用随书代码中的 HexView,查看十六进制格式的机器码,下载链接如下: http://www.lizhongc.com/x86asm/serv.asp

    编译之后的文件只有 7 个字节,这才是处理器可以识别并执行的机器指令。

    003cde19e5dd06c2b8d9363c6f8c4585.png
    展开全文
  • 64位汇编转机器码

    2017-06-30 13:28:02
    windows 64位汇编语言 转机器码工具
  • 机器码的指令字,用文本文件保存,将指令字保存成.S文件,如下格式: .inst 0xf9440e11 .inst 0x9120a210 (1) 用对应架构的的汇编器,编译成目标文件。命令:as a.s -o a.out (2)用objdump反汇编,生成...
  • 汇编转机器码工具 ARM
  • 单片机51汇编代码与机器码转换对照表,是进行反汇编的有效利器。
  • 汇编转机器码

    2020-10-02 14:28:54
    case i_cmp://80 /7 ib CMP r/m8,imm8 81 /7 id CMP r/m32,imm32 writeBytes(opcode,1); exchar=0xf8;...操作是一个组属性操作,需要modR/M中的reg/opcode字段指明具体指令。 modR/M的mod为3...
  • 1491911AsmToHex1491911AsmToHex1491911AsmToHex1491911AsmToHex1491911AsmToHex1491911AsmToHex1491911AsmToHex
  • 转移指令的原理可以修改IP,或同时修改CS和IP的指令通称为转移指令。8086CPU的转义行为有一下几类。只修改IP时,称为段内转移,比如:jmp ax。同时修改CS和IP时,称为段间转移,比如:jmp 1000:0由于...8086CPU的...
  • 可以将汇编码和机器码的东西。方便写程序
  • 可以将汇编语句转换为机器码语句,也可以反转换。
  • 为了看看这些错误是怎样产生的,我开始从我所能收集到的信息开始推进操作系统:l 《汇编语言 王爽著》l 《x86汇编语言:从实模式到保护模式》l 《操作系统设计与实现》l 《《操作系统设计与实现》Andrew S.Tanenbaum...
  • 汇编指令与机器码的相互转换规则,说白了,就是如何手工把汇编语言转换为及其语言、、、主要就是解决这个问题~~欢迎下载来参考下~~
  • 介绍汇编语言组成汇编指令:机器码的助记符,有对应的机器码。伪指令:没有对应的机器码,编译器执行,机器不执行。其他符号:如+-*/有编译器识别,无对应机器码。要求现要将字符串中的全部大写字母转换成小写字母,...
  • 51指令机器码对照表

    2018-05-05 02:20:50
    51机器码的对照表,汇编和机器码对照表,汇编指令机器码对应表,机器码转汇编,汇编 机器码,汇编指令对应的机器码,汇编指令转机器码,汇编指令 机器码,字节码和机器码,
  • 汇编转机器码工具DasmX86.rar_924
  • 程序入口 Start //测试代码,添加在以下位置即可,后面不再贴完整代码 mov r1,#0x80000001 OVER END 然后点击debug按钮,查看对应的机器码: 机器指令 得到mov r1,#0x80000001指令的机器码是E3A01106 我们来分析...
  • 机器语言指令有操作(OP)和地址两部分组成机器语言我们只要重点理解一下几个概念:1. 机器语言指令有操作(OP)和地址两部分组成|_____________OP_______________|__d__|__w__||_____________OP______________...
  • 也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种“一切尽在掌握”的赶脚。而用c语言实现操作系统这件事,虽然轻松很多,但似乎隐约感觉到有些慌张。因为虽然c语言...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 717
精华内容 286
关键字:

机器码转汇编