精华内容
下载资源
问答
  • ARM处理器Intel处理器之间有很多的差异,其中最大的不同点就是它们的指令集。Intel是一个CISC(Complex Instruction Set Computing,复杂指令集)处理器。因此它具有更庞大,功能更丰富的指令集,并且允许指令进行...

    ARM处理器和Intel处理器之间有很多的差异,其中最大的不同点就是它们的指令集。Intel是一个CISC(Complex Instruction Set Computing,复杂指令集)处理器。因此它具有更庞大,功能更丰富的指令集,并且允许指令进行一些复杂的访存操作。它也因此具有支持更多的复杂操作和寻址方式,并且寄存器的数量比ARM要少的多。CISC处理器一般用在通用PC,工作站和服务器中。

    而ARM是一个RISC(Reduced Instruction Set Computing,精简指令集)处理器。因此它拥有一套精简的指令集(100个左右,甚至更少的指令)以及比CISC处理器更多的通用寄存器。与Intel处理器不同,ARM指令只处理寄存器中的数据,并使用了load/store结构访问存储器,也就是说只有load/store指令可以访问存储器。所以如果我们要增加某个内存地址中保存的值,至少需要三种类型的指令(load指令、加法指令和store指令),首先我们需要使用load指令将指定地址内存中的值加载到寄存器中,然后使用加法指令增加寄存器中的值,然后用store指令将寄存器中的值写回内存。

    其中指令集(instructionset),也称为ISA(instructionset architecture),其本质上是机器语言,用于向处理器提供命令,以告诉处理器它需要做什么,如何去做。

    01c146671a189581c3b11d5b308e8d82.png

    指令集实际就是软件和硬件之间的一个接口,通过软件来告诉硬件去做什么的一种机制。无论上层软件使用的是Java,C,C++,最终都会编译成汇编语言,而后由汇编语言转换成0/1格式的机器码在硬件上运行。

    ARM处理器可以支持3种指令集——ARM,Thumb 和 Jazelle

    采用那种指令集,由cspr中的标志位来决定。大体说来:

    • ARM——这是ARM自身的32位指令集

    • Thumb ——这是一个全16位的指令集,在16位外部数据总线宽度下,这个指令集的效率要比32位的ARM指令高一些。

    • Jazelle ——这是一个8位指令集,用来加速Java字节码的执行


    Load-Store 架构:

    c9944a6d704084c708c1b966211cae2d.png

    • 如果要处理存储器中的数据,则必须首先将数据加载到处理器的寄存器中处理,处理结束后,可以将结果返回给存储器;

    • 不支持memory到memory数据操作

    •  严重依赖寄存器;但执行效率更加高效


    ARM机器码:

    951c10baeab8f991334e940cb24ae518.png

    28~31bits(cond)是条件码,就是表明这条语句里是否有大于、等于、非零等的条件判断,这4bits共有16种状态

    b1cf861686a1c13cb7113025a00cabf6.png

    09d324ccf742be0055248f65eabc9ee5.png


    ARM汇编指令:

    400b43de6e0bbbe07ed3edebe8f73d7b.png

    上图中,像LDR、ADD、STR 等,这些都是汇编指令,或者说它们是“助记符”──帮助我们记忆的。

    记忆什么呢?这些指令其实就是一个个的数值,我们直接去记这些数值实在太有难度了,所以就用 LDR、ADD 等这些符号来表示不同指令对应的数值。

    汇编指令格式,如下:

    label:      instruction @ comment

    label,即标签,表示地址位置,可以通过 label 得到指令/数据地址 。

    instruction,即指令,表示汇编指令或伪指令。

    @ comment,@表示后面是注释,comment 表示注释内容

    如下:

    addnum:        mov r0, #0 @ 将R0寄存器设置成0

    addnum表示标签;

    mov r0, #0表示指令;

    @ 将R0寄存器设置成0表示注释;

    常用的汇编指令一般有 mov、bl/b、add/sub、ldr/str、ldr伪指令、ldm/stm、push/pop等等,下面一一介绍。


    MOV 指令

    Move register or constant,把某个寄存器的值移给另一个寄存器,或是把一个常数移入寄存器。

    mov r1#10  @将10赋值给寄存器r1,即r1=10

    指令执行过程如下:

    79e3fe0f3b4eebe799e9b28e757c04f3.png

    1. 取指
        假设从内存的addrA地址取机器码e3a0100a(即 mov r1, #10 指令)

    2. 译码
        原来是MOV 指令

    3. 执行
        CPU 内部寄存器 R1 等于 10

    其中,机器码 e3a0100a,MOV 指令各位的解析如下:

    dfb6c61dedacd0d7eaa8d039e23133ca.png

    [31:28]位是条件码0xe;

    [15:12]位是寄存器R1,即0x1;

    [12:0]位是立即数10,即0x00a;


    BL指令

    Branch with Link,跳转并把返回地址记录在 LR 寄存器里。

    bl test_tagmov r1, #10test_tag:          mov r3, #0          mov pc, lr

    第 1 行,跳转到 test_tag 标签处执行“mov r3, #0”指令,并且将下一条指令即“mov r1, #10”指令的地址存储到LR 寄存器。

    第 6 行,返回到“mov r1, #10”指令地址,并且执行“mov r1, #10”指令。

    指令执行过程如下:

    fc7d871087061519f36e712d84528a0c.png

    1. CPU 从内存的addrA地址取机器码eb000000(即“bl test_tag”指令),执行后,PC 跳转到 test_tag 标签位置,即内存的addrA+8地址,从上图可知,其实 test_tag 标签的地址是“mov r3, #0”指令的地址。同时自动将内存的addrA+4 地址存储在寄存器LR中。

    2. CPU 从内存的 addrA+8 地址取机器码 e3a03000(即“mov r3, #0”指令),执行,CPU 内部寄存器 R3 等于 0。

    3. CPU 从内存的 addrA+12 地址取机器码 e1a0f00e(即“mov pc, lr”指令),执行,PC 跳转到内存的 addrA+4 地址。

    4. CPU从内存的addrA+4地址取机器码e3a0100a(即“mov r1, #10”指令),执行,CPU内部寄存器 R1等于10。

    其中,机器码 eb000000,BL 指令各位的解析如下:

    aa97067f57a50a8bbfc03a1a90777f47.png

    imm[23:0]是PC值与标签的偏移值除以4,但是此处的偏移值是0,为什么呢? 这是因为ARM采用三级流水线的方法,即取指、译码、执行指令。所以当ARM执行addrA地址的“bl test_tag”指令时,PC 已经指向addrA+8地址进行取“mov r3, #0”指令,也就是PC值等于当前指令地址加8,所以要跳去执行 “addrA+8”的指令,偏移值就要设置为0:执行这条bl 指令后,新的 PC=PC+偏移,刚好就是“addrA+8”。


    B指令

    Branch,跳转指令。相比于 BL 指令,它并不保存下一条指令的地址到 LR 寄存器。

    b test_tagmov r1, #10test_tag:          mov r3, #0

    第 1 行,只是跳转到test_tag标签处执行“mov r3, #0”指令,并没有保存返回地址到LR寄存器中。


    ADD/SUB 指令

    加法、减法指令。

    mov r1, #10add r2, r1, #4sub r2, r1, #4

    第 2 行,r2 = r1 + 4。 

    第 3 行,r2 = r1 - 4。

    指令执行过程如下:

    17a8eb594df7ec93d86d740fd54e27f9.png

    1.  CPU 从内存的addrA+4地址取机器码e2812004(即 add r2, r1, #4 指令),执行后,CPU 内部寄存器 R2 等于 14

    2. CPU 从内存的 addrA+8 地址取机器码 e2412004(即 sub r2, r1, #4 指令),执行后,CPU 内部寄存器 R2 等于6

    其中,机器码 e2812004,ADD 指令各位的解析如下:

    0b112a76ddc761a6836d1f7546471949.png

    [19: 16]位是源寄存器 R1,即 1;

    [15: 12]位是目标寄存器 R2,即 2;

    [11: 0]位是立即数 4,即 0x004; 

    其中,机器码 e2412004,SUB 指令各位的解析如下:

    9e25dc661faae9861e1dc01d47eee216.png

    [19: 16]位是源寄存器 R1,即 1;

    [15: 12]位是目标寄存器 R2,即 2;

    [11: 0]位是立即数 4,即 0x004;


    LDR/STR 指令

    Load register from memory/Store register to memory,前者是读内存到寄存器,后者是把寄存器的值写入内存。

    mov r0, #400H @ 0x400 mov r1, #aH @ 0xastr r1, [r0]ldr r2, [r0]

    第 3 行,将寄存器 R1 的值 0xa 存储到寄存器 R0 指向的地址 0x400;

    第 4 行,将寄存器 R0 指向地址 0x400 的数据赋值给寄存器 R2

    指令执行过程如下:

    2d31a374d36b7d9c2f9eb1576d2768bd.png

    1. CPU 从内存的 addrA 地址取机器码 e3a00b01(即 mov r0, #400H 指令),执行后,CPU 内部寄存器 R0 等于 0x400

    2. CPU 从内存的 addrA+4 地址取机器码 e3a0100a(即 mov r1, #aH 指令),执行后,CPU 内部寄存器 R1 等于 0xa

    3. CPU 从内存的 addrA+8 地址取机器码 e5801000(即 str r1, [r0]指令),执行后,寄存器 R1 的 0xa 数据存储到寄存器 R0 指向的地址 0x400,即内存的 0x400 地址的值为 0xa

    4. CPU从内存的addrA+12地址取机器码e5902000(即ldr r2, [r0]指令),执行后,寄存器R0指向的地址0x400的数据存储到 CPU 内部寄存器 R2,即 CPU 内部寄存器 R2 等于0xa

    其中,机器码 e5801000,STR 指令各位的解析如下:

    a0c0715a8f7cfa101f63ec65482baa58.png

    [19: 16]位是目标寄存器 R0,即 0;

    [15: 12]位是源寄存器 R1,即 1;

    其中,机器码 e5902000,LDR 指令各位的解析如下:

    5fbfb23bcba738943c6cb6f1c5312e77.png

    [19: 16]位是源寄存器 R0,即 0;

    [15: 12]位是目标寄存器 R2,即 2;


    LDR 伪指令

    所谓“伪指令”就是假的、不真实存在的指令。编译器会用真正的指令来代替它。ldr 指令的参数中,有“=”时,它就是伪指令,不再是上面所讲的“读内存”指令了。

    ldr sp,=0x80200000

    这个是一条伪指令,即实际中并不存在这个指令,它会被拆分成几个真正的 ARM 指令,实现一样的效果,将 0x80200000 赋值给寄存器 sp,即 sp=0x80200000。

    指令执行过程如下:

    d9641654c2db6c1b9c5d6416fb6ecf65.png

    ldr sp,=0x80200000 这条伪指令,被翻译成一条真正的指令来执行: ldr sp, [pc, #-4]。它是一条读内存指令,显然,在“pc-4”这个地址对应的内存里存有 0x80200000 这个数值。这是编译器预先把 0x80200000 设置在这个地址的。


    LDM/STM 指令

    ldm,Load multiple registers,从内存里把值加载进多个寄存器。

    stm,Store Multiple,把多个寄存器的值存储到内存。

    格式如下:

    ldm{cond} Rn{!}, regliststm{cond} Rn{!}, reglist

    参数说明:

    cond: 如下所示,

    下面列出的前四个条件是用于数据块操作,后四个条件是用于堆栈操作:IA : Increment After,先传输再增加地址IB : Increment Before,先增加地址再传输DA : Decrement After,先传输再减小地址DB : Decrement Before,先减小地址再传输FD : 满递减堆栈FA : 满递增堆栈ED : 空递减堆栈EA : 空递增堆栈

    Rn: 基址寄存器,里面含有内存的起始地址。

    !: 表示最后的地址写回到 Rn 中。

    reglist: 里面列出多个寄存器,如{R1,R2,R6-R9}。

    注意: 传输数据时,低号寄存器对应低地址,高号寄存器对应高地址。

    ldr r1, =0x10000000ldmib r1!, {r0,r4-r6} stmda r1!, {r0,r4-r6}

    第 1 行,将起始地址 0x10000000 赋值给 r1

    第 3 行,因为使用 ib,所以每次传送前地址加 4,具体操作如下(低地址的值存入低号寄存器):

    将 0X10000004 地址的内容赋值给 R0

    将 0X10000008 地址的内容赋值给 R4

    将 0X1000000C 地址的内容赋值给 R5

    将 0X10000010 地址的内容赋值给 R6

    “!” 表示,最后的地址写回到 R1 中,即 R1=0X10000010

    第 4 行,因为使用 da,所以每次传送后地址减 4,具体操作如下(低号寄存器的值存入低地址): 

    将 R6 存储到 0X10000010 地址将 R5 存储到 0X1000000C 地址将 R4 存储到 0X10000008 地址将 R0 存储到 0X10000004 地址

    “!”表示,最后的地址写回到 R1 中,R1=0X10000000 

    如下图所示:

    8e98d900cfae0d7d9f4c6f0791a4c4e5.png

    堆栈操作:满递减堆栈

    ldr sp,=0x80200000stmfd sp!, {r0-r2} @ 入栈ldmfd sp!, {r0-r2} @ 出栈

    第 1 行,将 0x80200000 赋值给 sp,作为堆栈的起始地址

    第 3 行,入栈,具体操作如下: 

    将 R2 存储到 0X80200000 地址将 R1 存储到 0X801FFFFC 地址将 R0 存储到 0X801FFFF8 地址

    第 4 行,出栈,具体操作如下: 

    将 0X801FFFF8 地址的内容赋值给 R0将 0X801FFFFC 地址的内容赋值给 R1将 0X80200000 地址的内容赋值给 R2如下图所示:

    08e443bd63681b6cd5c3a55101d0c1da.png

    上述第 3,4 行汇编代码,就是所谓的入栈,出栈。也可以用 push,pop 指令完成入栈,出栈,如下

    ldr sp,=0x80200000 push {r0-r2} @ 入栈 pop {r0-r2}  @ 出栈
    展开全文
  • 嵌入式汇编和机器码的反汇编

    千次阅读 2016-03-31 15:10:50
    0.11 Linux中的一段嵌入式汇编代码 与 机器码的反汇编代码的一些对比

    以下程序是0.11 Linux中的一段嵌入式汇编代码

    #define __set_tssldt_desc(n, addr, type) \
    __asm__ ("movw $104, %1\n\t" \
             "movw %%ax, %2\n\t" \
             "rorl $16, %%eax\n\t" \
             "movb %%al, %3\n\t" \
             "movb $"type ", %4\n\t" \
             "movb $0x00, %5\n\t" \
             "movb %%ah, %6\n\t" \
             "rorl $16, %%eax" \
             :
             :"a"(addr), "m"(*(n)), "m"(*(n+2)), "m"(*(n+4)), \
              "m"(*(n+5)), "m"(*(n+6)), "m"(*(n+7)) \
            )
    

    我在用bochs 2.1.1版本debug的过程中,看到这段代码对应的实际执行的机器码及其反汇编代码如下:

    000072c4: (                    ): mov dword ptr ss:[ebp+0xfffffffc], 0x1847c ; c745fc7c840100
    000072cb: (                    ): mov eax, dword ptr ss:[ebp+0xfffffffc] ; 8b45fc
    000072ce: (                    ): opsize mov word ptr [ds:0x5cd8], 0x68 ; 66c705d85c00006800
    000072d7: (                    ): opsize mov [ds:0x5cda], ax ; 66a3da5c0000
    000072dd: (                    ): ror eax, 0x10             ; c1c810
    000072e0: (                    ): mov al, byte ptr [ds:0x5cdc] ; 8805dc5c0000
    000072e6: (                    ): mov byte ptr [ds:0x5cdd], 0x89 ; c605dd5c000089
    000072ed: (                    ): mov byte ptr [ds:0x5cde], 0x0 ; c605de5c000000
    000072f4: (                    ): mov ah, byte ptr [ds:0x5cdf] ; 8825df5c0000
    000072fa: (                    ): ror eax, 0x10             ; c1c810
    

    两段代码的对应关系如下:

    行数 嵌入式汇编 机器码的反汇编
    1 “movw $104, %1\n\t” opsize mov word ptr [ds:0x5cd8], 0x68
    2 “movw %%ax, %2\n\t” opsize mov [ds:0x5cda], ax
    3 “rorl $16, %%eax\n\t” ror eax, 0x10
    4 “movb %%al, %3\n\t” mov al, byte ptr [ds:0x5cdc]
    5 “movb $”type “, %4\n\t” mov byte ptr [ds:0x5cdd], 0x89
    6 “movb $0x00, %5\n\t” mov byte ptr [ds:0x5cde], 0x0
    7 “movb %%ah, %6\n\t” mov ah, byte ptr [ds:0x5cdf]
    8 “rorl $16, %%eax” ror eax, 0x10

    我不太理解的地方是第4行和第7行的代码对应关系。
    以第四行举例,嵌入式汇编是把寄存器al的值放入变量3对应的内存中,而从机器码的反汇编结果来看,像是把地址ds:0x5cdf中的值放入ah中。
    但是我在单步执行的时候查看了寄存器eax,并未被改变,而ds:0x5cdc却被改变了,难道是反汇编的翻译错误?

    搜到oldlinux的讨论,居然版主也不知道为什么有双向的赋值。。。。

    我又用bochs 2.3.7版本进行debug,看到反汇编的代码如下:

    000072c4: (                    ): mov dword ptr ss:[ebp+0xfffffffc], 0x0001847c; c745fc7c840100
    000072cb: (                    ): mov eax, dword ptr ss:[ebp+0xfffffffc] ; 8b45fc
    000072ce: (                    ): mov word ptr ds:0x5cd8, 0x0068 ; 66c705d85c00006800
    000072d7: (                    ): mov word ptr ds:0x5cda, ax ; 66a3da5c0000
    000072dd: (                    ): ror eax, 0x10             ; c1c810
    000072e0: (                    ): mov byte ptr ds:0x5cdc, al ; 8805dc5c0000
    000072e6: (                    ): mov byte ptr ds:0x5cdd, 0x89 ; c605dd5c000089
    000072ed: (                    ): mov byte ptr ds:0x5cde, 0x00 ; c605de5c000000
    000072f4: (                    ): mov byte ptr ds:0x5cdf, ah ; 8825df5c0000
    000072fa: (                    ): ror eax, 0x10             ; c1c810
    

    这段代码的反汇编结果已经被修正,看来是bochs 2.1.1反汇编时出错了

    展开全文
  • 由于要在PE文件中修改代码,本质上是在改十六进制的机器码(shellcode为经过处理的机器码),而我们阅读的是汇编码,汇编码和机器码相互转化可以更好的修改程序。本来想用pwn tool或OllyDbg来转化,但通过搜索linux的...

    由于要在PE文件中修改代码,本质上是在改十六进制的机器码(shellcode为经过处理的机器码),而我们阅读的是汇编码,汇编码和机器码相互转化可以更好的修改程序。本来想用pwn toolOllyDbg来转化,但通过搜索linux的调试工具,radare2有附加的工具来转化。

    (1) radare2安装
    apt install radare2
    

    Windows下载地址:http://radare.mikelloc.com/list,下载zip包,install的安装后无法使用,这边使用radare2-msvc_64-3.9.0.ziphttps://github.com/radareorg/radare2/releases/tag/3.2.1有32/64位的zip包。
    github:https://github.com/radareorg/radare2/issues/12799

    ra+TAB显示相关的命令:

    rabin2.exe    radiff2.exe   ragg2.exe     ranlib.exe    rasautou.exe  raserver.exe  rasphone.exe
    radare2.exe   rafind2.exe   rahash2.exe   rarun2.exe    rasdial.exe   rasm2.exe     rax2.exe
    
    (2) 转化
    rasm2 -L    #查看architectures
    rasm2 -a x86 -b 32 'mov eax, 33'    #转机器码
    echo 'push eax;nop;nop' | rasm2 -f -   
    
    rasm2 -a x86 -d 55  #转汇编 push ebp
    
    (3) radare2使用

    radare2用于静态分析,用radare2 -d C:\Windows\System32\notepad.exe来动态调试,但在windows上调试功能不完善,基本上无法调试。

    radare2 静态分析

    crackme程序下载:https://github.com/radareorg/radare2book/blob/master/crackmes/ioli/IOLI-crackme.tar.gz

    分析符号

    r2 -A crackme0x00.exe
    

    r2命令行下用aaa(analyze)来分析

    查看帮助:? a? d? i? p?

    a = analyze

    d = Debug|Display

    i = info

    p = print

    查看函数

    pdf @ main  #或地址
    
    ii  #导入表
    iE  #导出表
    

    进入地址

    s 0x00401303    #seek
    

    查看二进制信息

    iI
    

    查看汇编码

    pd 9    #前9行
    

    查看寄存器

    dr
    dr eax
    

    数值计算

    ? eax
    ? 0x00401260
    ? 0x45-12
    

    计算汇编码

    pa push ebp;    #汇编
    paD 55          #反汇编 pad 55
    

    计算hash

    ph
    

    图形界面

    v   #q退出
    

    环境变量

    e asm.cpu=x86
    

    c源码

    pdc
    
    (4) 快速进入radare2
    radare2 -
    

    修改内存

    w a #写入字符
    x   #查看hex x?=px?
    
    wx 55 @ 0x01    #在0x01写入机器码55
    x
    pd 5    #查看前5行汇编码
    
    wa push eip;    #写入汇编码
    
    wb 00   #循环填充00 即全部清零
    x
    
    (5) radare2图形界面:cutter

    cutter下载地址https://github.com/radareorg/cutter

    cutter的UI用Qt5写,radare2成为库函数

    打开cutter,在Windows\console可以打开r2命令行。由于终端经过IO重定向,如果使用v等死循环的命令时会卡UI。

    (6) radare2附加的工具

    rax2 数值计算

    rax2 45+0x12
    rax2 -s 4142    #AB
    rax2 -S AB  #4142
    rax2 -S < bin.foo
    

    rafind2 查找

    rafind2 -s lib /bin/ls  #search for a specific string
    rafind2 -z /bin/ls  #search for zero-terminated strings
    

    rarun2 环境变量设置

    rabin2 文件属性

    rabin2 -I /bin/ls   #info
    

    radiff2 比较

    rasm2 汇编|反汇编

    rasm2 -L    #列出架构
    rasm2 -a x86 -b 32 'mov eax, 33'    #汇编
    rasm2 -a x86 -b 32 -d '90'  #反汇编
    

    ragg2 构造注入

    rahash2 哈希算法

    rahash2 -a md5 -s "hello world"
    rahash2 -B 1M -b -a sha256 /bin/ls
    
    (7) 参考
    展开全文
  • 由于机器码是有01组成的二进制序列,可读性实在太差,于是人们发明了指令。 指令就是把机器码中特定的01序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好 由于 不同的硬件平台,执行同一个...

    机器码

    一组特定硬件(不光是计算机,手机、嵌入式系统等)能够执行的代码,它是由0和1组成的二进制序列。

    不同的硬件平台,执行同一个操作,对应的机器码可能不同

    指令

    由于机器码是有0和1组成的二进制序列,可读性实在太差,于是人们发明了指令。

    指令就是把机器码中特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好

    由于 不同的硬件平台,执行同一个操作,对应的机器码可能不同,所以 不同的硬件平台的同一种指令(比如mov),对应的机器码也可能不同。

    指令集

    不同的硬件平台,各自支持的指令,是有差别的。因此每个平台所支持的指令,称之为对应平台的指令集。 如常见的

    • x86指令集,对应的是x86架构的平台
    • ARM指令集,对应的是ARM架构的平台

    汇编语言

    由于 指令 的可读性还是太差,于是人们又发明了汇编语言。

    在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label) 代替指令或操作数的地址

    在不同的硬件平台,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

    三者关系

    简单理解就是

    • 每一种硬件平台对应一种机器码
    • 每一种机器码对应一套指令集
    • 每一套指令集对应一种汇编语言

    转载于:https://juejin.im/post/5ccc79e4518825418f6f2642

    展开全文
  • 虽然机器码和内存地址领证在一起了,但是俩个人都和汇编指令有着说不清的关系,机器码的前任是汇编指令,而汇编指令又与内存地址暗地相通,这究竟是道德的沦丧还是人性的扭曲,今天就让我来领大家细细分解这三者的...
  • ARM 汇编指令对应的机器码和条件码

    千次阅读 2018-05-06 22:16:34
    一、ARM 汇编指令对应的机器码二、条件码
  • 机器码汇编指令的关系

    千次阅读 2012-04-21 23:50:13
    最近很多发帖求助机器码汇编指令对应的问题, 所以自己索性就把资料直接贴出来了,大家都可以看到,因为汇编教科书里面没有说到此点,大家想了解就细细琢磨一下把! 一、状态寄存器 PSW(Program Flag)程序...
  • 本文简单介绍了汇编语言的历史,一个流行的开源汇编软件 NASM,安装与文本编译器 NotePad++ 的方法。使用 NotePad 写了一个简单的汇编程序,并使用随书工具 HexView 查看。汇编语言简介在前面的章节里,我们讲到了...
  • 预备知识: r命令查看,改变CPU寄存器的内容 ...内存中写入机器码 ...用T命令执行机器码(先将CS:IP指向要执行的内存处) 用a命令写汇编指令 试验任务: 计算2^8 ...
  • 机器码的助记符,有对应的机器码(2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行(3)其他符号:+,-,*,/等,由编译器识别,没有对应的机器码汇编语言的核心是汇编指令,它绝对了汇编语言的特性,就像...
  • 汇编机器码

    2017-06-07 10:42:45
    8086 汇编和机器码的对应表 https://wenku.baidu.com/view/77d6be5cff00bed5b9f31d56.html 51汇编和机器码对照表 https://wenku.baidu.com/view/85451cec4afe04a1b071de0f.html 51汇编和机器码对照表 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,842
精华内容 736
关键字:

机器码和汇编