精华内容
下载资源
问答
  • 汇编指令汇编指令详解)
    2021-01-27 09:04:02

    哈哈,太多了汇编命令详解名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump) 内存16进制显示 d [address]或 d [range] e 。。

    常用指令意思用法?。

    MOV(MOVe) 传送指令PUSH 入栈指令POP 出栈指令XCHG(eXCHanG) 交换指令XLAT(TRANSLATE) 换码指令LEA (Load Effective Address) 有效地址送寄存器指令LDS(。。

    最佳答案:IBM-PC汇编语言指令集数据传送指令集 MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,。。

    伪指令不是正常功能指令,不进行具体的操作,不占用机器周期,属于指示性指令,主要用来指定程序的起始和结束位置,如ORG,END,$等,数据存放的地址和内存变量。。

    1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX reg32,r/m8 ; o32 0。。

    xor 异或 对于二进制0和1而言,相异为一,相同为0。如 1 xor 0=1,1 xor 1=0shr,shift logical right(逻辑右移),用于汇编语言中,属于逻辑运算中的移位指令。 rep ,只有。。

    可以理解成命令,汇编语言都是指令组成,对比其他高级语言的明显区别 总线是一种内部结构,它是cpu,内存,输入,输出设备传递信息的公用通道,主机的各个部件通。。

    它对应的汇编指令,如下 前面的 DB 我懂 就是 定义 各个字母 所对应的 16进。。

    0x70对应的助记符就是JO 0182指的是跳转到的地址。

    使用汇编语言中的call命令 ,伴随着一些【内容】的入栈,那么,入栈的都是一些。。

    call di 和 call dword ptr [di]都是对的,但功能(结果)不一样。call di是说所调用的子程序的入口偏移地址=di的值,段地址cs不变(段内调用);call dword ptr [di]是说所调。。

    051指令集资料转移指令 MOV 移动MOVC 程式记忆体移动MOVX 外部RAM和扩展I/O口与累加器A的数据传送指令PUSH 放入堆叠POP 由堆叠取回XCH 8位元交换XCHD 。。

    本文由摸索网(http://www.lnmosuo.com)发布,不代表摸索网立场,转载联系作者并注明出处:http://www.lnmosuo.com/chuangye/27713.html

    更多相关内容
  • 汇编指令

    2021-01-13 19:58:58
    一、数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1.通用数据传送指令. MOV传送字或字节. MOVSX先符号...

    一、数据传输指令  ───────────────────────────────────────      它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.      1. 通用数据传送指令.          MOV    传送字或字节.          MOVSX  先符号扩展,再传送.          MOVZX  先零扩展,再传送.          PUSH    把字压入堆栈.          POP    把字弹出堆栈.          PUSHA  把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.          POPA    把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.          PUSHAD  把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.          POPAD  把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.          BSWAP  交换32位寄存器里字节的顺序          XCHG    交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)          CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )          XADD    先交换再累加.( 结果在第一个操作数里 )          XLAT    字节查表转换.                  ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即                  0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )      2. 输入输出端口传送指令.          IN      I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )          OUT    I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )            输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,            其范围是 0-65535.      3. 目的地址传送指令.          LEA    装入有效地址.            例: LEA DX,string  ;把偏移地址存到DX.          LDS    传送目标指针,把指针内容装入DS.            例: LDS SI,string  ;把段地址:偏移地址存到DS:SI.          LES    传送目标指针,把指针内容装入ES.            例: LES DI,string  ;把段地址:偏移地址存到ES:DI.          LFS    传送目标指针,把指针内容装入FS.            例: LFS DI,string  ;把段地址:偏移地址存到FS:DI.          LGS    传送目标指针,把指针内容装入GS.            例: LGS DI,string  ;把段地址:偏移地址存到GS:DI.          LSS    传送目标指针,把指针内容装入SS.            例: LSS DI,string  ;把段地址:偏移地址存到SS:DI.      4. 标志传送指令.          LAHF    标志寄存器传送,把标志装入AH.          SAHF    标志寄存器传送,把AH内容装入标志寄存器.          PUSHF  标志入栈.          POPF    标志出栈.          PUSHD  32位标志入栈.          POPD    32位标志出栈.  二、算术运算指令  ───────────────────────────────────────            ADD    加法.          ADC    带进位加法.          INC    加 1.          AAA    加法的ASCII码调整.          DAA    加法的十进制调整.          SUB    减法.          SBB    带借位减法.          DEC    减 1.          NEC    求反(以 0 减之).          CMP    比较.(两操作数作减法,仅修改标志位,不回送结果).          AAS    减法的ASCII码调整.          DAS    减法的十进制调整.          MUL    无符号乘法.          IMUL    整数乘法.            以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),          AAM    乘法的ASCII码调整.          DIV    无符号除法.          IDIV    整数除法.            以上两条,结果回送:                商回送AL,余数回送AH, (字节运算);            或  商回送AX,余数回送DX, (字运算).          AAD    除法的ASCII码调整.          CBW    字节转换为字. (把AL中字节的符号扩展到AH中去)          CWD    字转换为双字. (把AX中的字的符号扩展到DX中去)          CWDE    字转换为双字. (把AX中的字符号扩展到EAX中去)          CDQ    双字扩展.    (把EAX中的字的符号扩展到EDX中去)  三、逻辑运算指令  ───────────────────────────────────────            AND    与运算.          OR      或运算.          XOR    异或运算.          NOT    取反.          TEST    测试.(两操作数作与运算,仅修改标志位,不回送结果).          SHL    逻辑左移.          SAL    算术左移.(=SHL)          SHR    逻辑右移.          SAR    算术右移.(=SHR)          ROL    循环左移.          ROR    循环右移.          RCL    通过进位的循环左移.          RCR    通过进位的循环右移.            以上八种移位指令,其移位次数可达255次.                移位一次时, 可直接用操作码.  如 SHL AX,1.                移位>1次时, 则由寄存器CL给出移位次数.                  如  MOV CL,04                      SHL AX,CL  四、串指令  ───────────────────────────────────────               DS:SI  源串段寄存器  :源串变址.              ES:DI  目标串段寄存器:目标串变址.              CX      重复次数计数器.              AL/AX  扫描值.              D标志  0表示重复操作中SI和DI应自动增量; 1表示应自动减量.              Z标志  用来控制扫描或比较操作的结束.          MOVS    串传送.              ( MOVSB  传送字符.    MOVSW  传送字.    MOVSD  传送双字. )          CMPS    串比较.              ( CMPSB  比较字符.    CMPSW  比较字. )          SCAS    串扫描.              把AL或AX的内容与目标串作比较,比较结果反映在标志位.          LODS    装入串.              把源串中的元素(字或字节)逐一装入AL或AX中.              ( LODSB  传送字符.    LODSW  传送字.    LODSD  传送双字. )          STOS    保存串.              是LODS的逆过程.          REP            当CX/ECX<>0时重复.          REPE/REPZ      当ZF=1或比较结果相等,且CX/ECX<>0时重复.          REPNE/REPNZ    当ZF=0或比较结果不相等,且CX/ECX<>0时重复.          REPC          当CF=1且CX/ECX<>0时重复.          REPNC          当CF=0且CX/ECX<>0时重复.  五、程序转移指令  ───────────────────────────────────────       1>无条件转移指令 (长转移)          JMP    无条件转移指令          CALL    过程调用          RET/RETF过程返回.      2>条件转移指令 (短转移,-128到+127的距离内)          ( 当且仅当(SF XOR OF)=1时,OP1循环控制指令(短转移)          LOOP            CX不为零时循环.          LOOPE/LOOPZ    CX不为零且标志Z=1时循环.          LOOPNE/LOOPNZ  CX不为零且标志Z=0时循环.          JCXZ            CX为零时转移.          JECXZ          ECX为零时转移.      4>中断指令          INT    中断指令          INTO    溢出中断          IRET    中断返回      5>处理器控制指令          HLT    处理器暂停, 直到出现中断或复位信号才继续.          WAIT    当芯片引线TEST为高电平时使CPU进入等待状态.          ESC    转换到外处理器.          LOCK    封锁总线.          NOP    空操作.          STC    置进位标志位.          CLC    清进位标志位.          CMC    进位标志取反.          STD    置方向标志位.          CLD    清方向标志位.          STI    置中断允许位.          CLI    清中断允许位.  六、伪指令  ───────────────────────────────────────            DW      定义字(2字节).          PROC    定义过程.          ENDP    过程结束.          SEGMENT 定义段.          ASSUME  建立段寄存器寻址.          ENDS    段结束.          END    程序结束.

    展开全文
  • 操作数作为指令的一部分直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 mov eax, 10h 直接寻址 在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址。 mov eax, [0x00304...

    立即寻址

    操作数作为指令的一部分直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。

    mov eax, 10h
    

    直接寻址

    在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址。

    mov eax, [0x00304C18h]
    

    寄存器寻址

    操作数在寄存器中,在指令中直接使用寄存器号的方式称为寄存器寻址。

    mov eax, [esi]
    

    寄存器间接寻址

    操作数在存储器中,操作数有效地址在esi,edi,ebx,ebp这四个寄存器之一中。

    一般情况下,如果有效地址在esi,edi,ebx中,则以ds寄存器之内容位段值。如果有效地址在ebp中,则以ss段寄存器之内容位段值。

    mov eax, es:[ebx] ;AX = ES x 16d + BX
    

    寄存器相对寻址

    操作数在存储器中,操作数的有效地址是一个寄存器(ebx,ebp)或变址寄存器(esi,edi)加上一个偏移数值之和。

    mov eax, [esi+0Ch]
    

    基址加变址寻址

    操作数在存储器中,操作数的有效地址是:基址寄存器(ebx,ebp)与变址寄存器(esi,edi)相加之和。

    mov eax, [ebp+esi]
    

    相对基址变址寻址

    操作数在存储器中,操作数的有效地址是:基址寄存器(ebx,ebp)、变址寄存器(esi,edi)与偏移数值相加之和。

    mov eax, [ebx+edi-18h]
    
    展开全文
  • 本文主要解析C语言中的流程控制语句if else、for、while、do while、switch语句的汇编指令。 操作系统:Ubuntu64位 IDE: Codeblocks 汇编格式:AT&T 1. 分支控制 if else #include <stdio.h> #include <...


    本文主要解析C语言中的流程控制语句if else、for、while、do while、switch语句的汇编指令。

    操作系统:Ubuntu64位
    IDE: Codeblocks
    汇编格式:AT&T

    1. 分支控制 if else
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a = 1;
        if(a>0){
            printf("%d\n",a);
        }else if(a == 0){
            printf("%d\n",a);
        }else{
            printf("%d\n",a);
        }
        return 0;
    }
    
    

    对应的汇编代码:

    ;5  :	{
    0x555555555149	endbr64
    0x55555555514d	push   %rbp
    0x55555555514e	mov    %rsp,%rbp
    0x555555555151	sub    $0x10,%rsp
    ;6  :	    int a = 1;
    0x555555555155	movl   $0x1,-0x4(%rbp)
    ##################################################### 
    	局部变量压栈
    #####################################################
    ;7  :	    if(a>0){
    0x55555555515c	cmpl   $0x0,-0x4(%rbp)
    0x555555555160	jle    0x55555555517a <main+49>
    #####################################################
    cmpl比较0和 %rbp-0x4(即a=1)的大小;
    jle差值如果小于或者等于0的话,程序跳转到0x55555555517a位置。
    #####################################################
    ;8  :	        printf("%d\n",a);
    0x555555555162	mov    -0x4(%rbp),%eax
    0x555555555165	mov    %eax,%esi
    0x555555555167	lea    0xe96(%rip),%rdi        # 0x555555556004
    0x55555555516e	mov    $0x0,%eax
    0x555555555173	callq  0x555555555050 <printf@plt>
    0x555555555178	jmp    0x5555555551ae <main+101>
    #####################################################
    将a的值送给%eax,将%eax值送给源地址寄存器%esi,取%rip+0xe96的地址送给
    %rdi,将0送给%eax,调用printf函数打印。 结束后跳转到0x5555555551ae。
    #####################################################
    ;9  :	    }else if(a == 0){
    0x55555555517a	cmpl   $0x0,-0x4(%rbp)
    0x55555555517e	jne    0x555555555198 <main+79>
    #####################################################
    比较0和a的大小,若差值不等于0,则跳转到0x555555555198
    #####################################################
    ;10 :	        printf("%d\n",a);
    0x555555555180	mov    -0x4(%rbp),%eax
    0x555555555183	mov    %eax,%esi
    0x555555555185	lea    0xe78(%rip),%rdi        # 0x555555556004
    0x55555555518c	mov    $0x0,%eax
    0x555555555191	callq  0x555555555050 <printf@plt>
    0x555555555196	jmp    0x5555555551ae <main+101>
    #####################################################
    同上述打印
    #####################################################
    ;11 :	    }else{
    ;12 :	        printf("%d\n",a);
    #####################################################
    同上述打印
    #####################################################
    0x555555555198	mov    -0x4(%rbp),%eax
    0x55555555519b	mov    %eax,%esi
    0x55555555519d	lea    0xe60(%rip),%rdi        # 0x555555556004
    0x5555555551a4	mov    $0x0,%eax
    0x5555555551a9	callq  0x555555555050 <printf@plt>
    ;13 :	    }
    ;14 :	    return 0;
    0x5555555551ae	mov    $0x0,%eax
    ;15 :	}
    0x5555555551b3	leaveq
    0x5555555551b4	retq
    
    

    可以看到,if else语句采用顺序逐个判断条件是否成立的做法,如果成立就继续执行完,然后跳出控制语句;否则就跳转到下一个else if进行条件判断。

    2. for循环
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        for(int i=0;i<5;i++){
            printf("%d\n",i);
        }
        return 0;
    }
    
    

    对应的汇编语句:

    0x555555555149	endbr64
    0x55555555514d	push   %rbp
    0x55555555514e	mov    %rsp,%rbp
    0x555555555151	sub    $0x10,%rsp
    0x555555555155	movl   $0x0,-0x4(%rbp) 
    #################将局部变量a=0压栈
    
    0x55555555515c	jmp    0x555555555178 <main+47>
    ###################################################
    循环开始,首先跳转到0x555555555178位置
    ###################################################
    
    0x55555555515e	mov    -0x4(%rbp),%eax
    0x555555555161	mov    %eax,%esi
    0x555555555163	lea    0xe9a(%rip),%rdi        # 0x555555556004
    0x55555555516a	mov    $0x0,%eax
    0x55555555516f	callq  0x555555555050 <printf@plt>
    0x555555555174	addl   $0x1,-0x4(%rbp)
    ###################################################
    如果小于等于4,跳转到上面这一部分,调用printf函数,并将a的值加1
    ###################################################
    
    0x555555555178	cmpl   $0x4,-0x4(%rbp)
    0x55555555517c	jle    0x55555555515e <main+21>
    ###################################################
    跳转到这里,让参数a和0x4进行比较,如果a小于等于4,就跳转到0x55555555515e 
    ###################################################
    
    0x55555555517e	mov    $0x0,%eax
    0x555555555183	leaveq
    0x555555555184	retq
    
    

    通过上述汇编程序,我们发现 for 循环的实现流程是进入后先跳转到最后判断是否符合循环条件,符合的话跳转到上面继续执行内部代码,并更新初始值,然后再判断是否满足条件,如此循环。

    3. while循环

    C代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a = 3;
        while(a>0){
            printf("%d\n",a);
            a--;
        }
        return 0;
    }
    
    

    对应的汇编代码:

    0x555555555149	endbr64
    0x55555555514d	push   %rbp
    0x55555555514e	mov    %rsp,%rbp
    0x555555555151	sub    $0x10,%rsp
    
    0x555555555155	movl   $0x3,-0x4(%rbp)
    ###################################################
    将参数a=3压栈
    ###################################################
    
    0x55555555515c	jmp    0x555555555178 <main+47>
    ###################################################
    循环开始,首先跳转到0x555555555178
    ###################################################
    
    0x55555555515e	mov    -0x4(%rbp),%eax
    0x555555555161	mov    %eax,%esi
    0x555555555163	lea    0xe9a(%rip),%rdi        # 0x555555556004
    0x55555555516a	mov    $0x0,%eax
    0x55555555516f	callq  0x555555555050 <printf@plt>
    0x555555555174	subl   $0x1,-0x4(%rbp)
    ###################################################
    如果满足循环条件,跳转到这里,调用printf函数,并将a-1
    ###################################################
    
    0x555555555178	cmpl   $0x0,-0x4(%rbp)
    0x55555555517c	jg     0x55555555515e <main+21>
    ###################################################
    跳转到这里,即比较变量a和0的大小,如果a>0,则跳转到0x55555555515e
    ###################################################
    0x55555555517e	mov    $0x0,%eax
    0x555555555183	leaveq
    0x555555555184	retq
    

    通过汇编代码我们可以看到,while循环和for循环的步骤基本是一致的,首先跳转比较;符合条件则跳转回去继续执行。

    4. do…while循环

    C代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a = 3;
        do{
            printf("%d\n",a);
            a--;
        }while(a>0);
        return 0;
    }
    
    

    对应的汇编代码:

    0x555555555149	endbr64
    0x55555555514d	push   %rbp
    0x55555555514e	mov    %rsp,%rbp
    0x555555555151	sub    $0x10,%rsp
    0x555555555155	movl   $0x3,-0x4(%rbp)
    ###################################################
    将局部变量a=3压栈
    ###################################################
    
    0x55555555515c	mov    -0x4(%rbp),%eax
    0x55555555515f	mov    %eax,%esi
    0x555555555161	lea    0xe9c(%rip),%rdi        # 0x555555556004
    0x555555555168	mov    $0x0,%eax
    0x55555555516d	callq  0x555555555050 <printf@plt>
    0x555555555172	subl   $0x1,-0x4(%rbp)
    ###################################################
    上述代码即调用printf函数,并将a的值减1
    ###################################################
    
    0x555555555176	cmpl   $0x0,-0x4(%rbp)
    0x55555555517a	jg     0x55555555515c <main+19>
    ###################################################
    比较a和0的大小,如果a>0,则跳转到0x55555555515c循环执行
    ###################################################
    
    0x55555555517c	mov    $0x0,%eax
    0x555555555181	leaveq
    0x555555555182	retq
    
    
    5. switch语句
    1. 非跳转表

    首先针对switch中case语句比较少的情况:

    C代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a = 2;
        switch(a){
            case 1:
                printf("a=1\n");
                break;
            case 2:
                printf("a=2\n");
                break;
            case 3:
                printf("a=3\n");
                break;
            default:
                printf("a=?\n");
    
        }
        return 0;
    }
    
    

    对应的汇编代码:

    ;5  :	{
    0x555555555149	endbr64
    0x55555555514d	push   %rbp
    0x55555555514e	mov    %rsp,%rbp
    0x555555555151	sub    $0x10,%rsp
    ;6  :	    int a = 2;
    0x555555555155	movl   $0x2,-0x4(%rbp)
    ###################################################
    将a=2压栈
    ###################################################
    
    ;7  :	    switch(a){
    0x55555555515c	cmpl   $0x3,-0x4(%rbp)
    0x555555555160	je     0x555555555192 <main+73>
    0x555555555162	cmpl   $0x3,-0x4(%rbp)
    0x555555555166	jg     0x5555555551a0 <main+87>
    0x555555555168	cmpl   $0x1,-0x4(%rbp)
    0x55555555516c	je     0x555555555176 <main+45>
    0x55555555516e	cmpl   $0x2,-0x4(%rbp)
    0x555555555172	je     0x555555555184 <main+59>
    0x555555555174	jmp    0x5555555551a0 <main+87>
    ###################################################
    	首先比较a和3的大小,若a=3,则跳转到0x555555555192;
    	若不等于3,再比较a和3的大小,若a>3,则跳转到0x5555555551a0;
    	再比较a和1的大小,若a=1,则跳转到0x555555555176;
    	再比较a和2的大小,若a=2,则跳转到0x555555555184;
    	否则跳转到0x5555555551a0。
    ###################################################
    
    ;8  :	        case 1:
    ;9  :	            printf("a=1\n");
    0x555555555176	lea    0xe87(%rip),%rdi        # 0x555555556004
    0x55555555517d	callq  0x555555555050 <puts@plt>
    ;10 :	            break;
    0x555555555182	jmp    0x5555555551ac <main+99>
    ;11 :	        case 2:
    ;12 :	            printf("a=2\n");
    0x555555555184	lea    0xe7d(%rip),%rdi        # 0x555555556008
    0x55555555518b	callq  0x555555555050 <puts@plt>
    ;13 :	            break;
    0x555555555190	jmp    0x5555555551ac <main+99>
    ;14 :	        case 3:
    ;15 :	            printf("a=3\n");
    0x555555555192	lea    0xe73(%rip),%rdi        # 0x55555555600c
    0x555555555199	callq  0x555555555050 <puts@plt>
    ;16 :	            break;
    0x55555555519e	jmp    0x5555555551ac <main+99>
    ;17 :	        default:
    ;18 :	            printf("a=?\n");
    0x5555555551a0	lea    0xe69(%rip),%rdi        # 0x555555556010
    0x5555555551a7	callq  0x555555555050 <puts@plt>
    ;20 :	    }
    ;21 :	    return 0;
    0x5555555551ac	mov    $0x0,%eax
    ;22 :	}
    0x5555555551b1	leaveq
    0x5555555551b2	retq
    
    

    switch语句中case比较少的情况,其比较过程比较简单,但是比较的顺序有些离奇;先比较a=3?,再比较a>3?,再比较a=1?,最后比较a=2?。

    2. 跳转表

    再来看case增多时:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a = 2;
        switch(a){
            case 1:
                printf("a=1\n");
                break;
            case 2:
                printf("a=2\n");
                break;
            case 3:
                printf("a=3\n");
                break;
            case 4:
                printf("a=4\n");
                break;
            case 5:
                printf("a=5\n");
                break;
            case 6:
                printf("a=6\n");
                break;
            case 7:
                printf("a=7\n");
                break;
            default:
                printf("a=?\n");
    
        }
        return 0;
    }
    
    

    对应的汇编代码:

    ;5  :	{
    0x555555555149	endbr64
    0x55555555514d	push   %rbp
    0x55555555514e	mov    %rsp,%rbp
    0x555555555151	sub    $0x10,%rsp
    ;6  :	    int a = 2;
    0x555555555155	movl   $0x2,-0x4(%rbp)
    
    0x55555555515c	cmpl   $0x7,-0x4(%rbp)
    0x555555555160	ja     0x5555555551ec <main+163>
    0x555555555166	mov    -0x4(%rbp),%eax
    0x555555555169	lea    0x0(,%rax,4),%rdx
    0x555555555171	lea    0xeac(%rip),%rax        # 0x555555556024
    0x555555555178	mov    (%rdx,%rax,1),%eax
    0x55555555517b	cltq
    0x55555555517d	lea    0xea0(%rip),%rdx        # 0x555555556024
    0x555555555184	add    %rdx,%rax
    0x555555555187	notrack jmpq *%rax
    ###############################################
    计算出跳转表将要跳转的地址(编译器可以识别到连续的case值,每个跳转项
    占4个字节,a*4+跳转表基址便得到了应当跳转的地址)
    ###############################################
    ;7  :	    switch(a){
    ;8  :	        case 1:
    ;9  :	            printf("a=1\n");
    0x55555555518a	lea    0xe73(%rip),%rdi        # 0x555555556004
    0x555555555191	callq  0x555555555050 <puts@plt>
    ;10 :	            break;
    0x555555555196	jmp    0x5555555551f8 <main+175>
    ;11 :	        case 2:
    ;12 :	            printf("a=2\n");
    0x555555555198	lea    0xe69(%rip),%rdi        # 0x555555556008
    0x55555555519f	callq  0x555555555050 <puts@plt>
    ;13 :	            break;
    0x5555555551a4	jmp    0x5555555551f8 <main+175>
    ;14 :	        case 3:
    ;15 :	            printf("a=3\n");
    0x5555555551a6	lea    0xe5f(%rip),%rdi        # 0x55555555600c
    0x5555555551ad	callq  0x555555555050 <puts@plt>
    ;16 :	            break;
    0x5555555551b2	jmp    0x5555555551f8 <main+175>
    ;17 :	        case 4:
    ;18 :	            printf("a=4\n");
    0x5555555551b4	lea    0xe55(%rip),%rdi        # 0x555555556010
    0x5555555551bb	callq  0x555555555050 <puts@plt>
    ;19 :	            break;
    0x5555555551c0	jmp    0x5555555551f8 <main+175>
    ;20 :	        case 5:
    ;21 :	            printf("a=5\n");
    0x5555555551c2	lea    0xe4b(%rip),%rdi        # 0x555555556014
    0x5555555551c9	callq  0x555555555050 <puts@plt>
    ;22 :	            break;
    0x5555555551ce	jmp    0x5555555551f8 <main+175>
    ;23 :	        case 6:
    ;24 :	            printf("a=6\n");
    0x5555555551d0	lea    0xe41(%rip),%rdi        # 0x555555556018
    0x5555555551d7	callq  0x555555555050 <puts@plt>
    ;25 :	            break;
    0x5555555551dc	jmp    0x5555555551f8 <main+175>
    ;26 :	        case 7:
    ;27 :	            printf("a=7\n");
    0x5555555551de	lea    0xe37(%rip),%rdi        # 0x55555555601c
    0x5555555551e5	callq  0x555555555050 <puts@plt>
    ;28 :	            break;
    0x5555555551ea	jmp    0x5555555551f8 <main+175>
    ;29 :	        default:
    ;30 :	            printf("a=?\n");
    0x5555555551ec	lea    0xe2d(%rip),%rdi        # 0x555555556020
    0x5555555551f3	callq  0x555555555050 <puts@plt>
    ;32 :	    }
    ;33 :	    return 0;
    0x5555555551f8	mov    $0x0,%eax
    ;34 :	}
    0x5555555551fd	leaveq
    0x5555555551fe	retq
    
    

    通过汇编文件也可以看到switch内部的跳转表实现:
    在这里插入图片描述

    展开全文
  • mo汇编move指令用法

    千次阅读 2014-04-14 18:02:40
    指令汇编格式:MOV DST,SRC 指令的基本功能:(DST) 指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令指令的执行对标志位的影响:不影响标志位。 指令的特殊要求:...
  • 汇编指令大全

    2020-12-23 05:15:48
    一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号...
  • 这里规定源和目标操作不能都指向存储器位置,从一个存储器位置复制到另一个存储器位置需要两条指令,第一条指令将源操作数加载到寄存器,第二条将寄存器的值写到目标位置指令动作描述MOVS,DDMovb传送字节Movw传送字...
  • MODEL-MO相关指令

    2020-12-23 05:15:46
    TG号CELLCHGR136B01C3910&...1rxbli:mo=rxotrx-136-0,subord,force;rxesi:mo=rxotrx-136-0,subord;rxmoe:mo=rxots-136-0-0&&-7;rxese:mo=rxotrx-136-0,subord;rxble:mo=rxotrx-136-0,subord;rxmoe:mo=rxotx-...
  • MCS-51单片机汇编指令详解

    千次阅读 2021-05-23 03:45:39
    这有什么意义呢?ACC中的值本来就是100,B中的值本来就是20,是的,在本例中,的确没有意义,但在实际...还有一个问题,如果我不用堆栈,比如说在PUSH ACC指令处用MOV 60H,A,在PUSH B处用指令MOV 61H,B,然后用MO...
  • 汇编语言指令功能总结

    千次阅读 2020-10-29 15:08:32
    0 操作数的表示方法 符号 表示内容 data 立即数 reg 通用寄存器(AX、BX、CX、DX、BP、SP、SI、DI) seg或segreg 段寄存器(CS、DS、SS、ES) ...汇编语言不区分大小写 ...1 数据传送类指令 1.1 MO
  • 第三章汇编指令汇总 以下是csapp书中常用的汇编指令的汇总 具体到每一行指令来看,是按照: 指令名称 操作数 功能描述 这样的格式组织的 希望能帮助大家复习,阅读第三章的代码 正文: mov类 movb S,D S->D ...
  • 汇编指令速查表

    2020-12-23 05:15:36
    一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号...
  • 16位模式下: 源地址是DS:SI,目的地址是ES:DI 32位模式下: 源地址是DS:ESI,目的地址是ES:EDI MOVSB, MOVSW, MOVSD 作用:移动字符串数据,复制由ESI寄存器寻址的内存地址处的数据到EDI寻址的内存处 ...单独的mo
  • ARM汇编指令

    2021-05-15 16:01:06
    GNU平台无关符号定义伪指令.global,.local,.set,.equ.global使得符号对连接器可见,变为对整个工程可用的全局变量.global symbol.local表示符号对外部不可见,只对本文件可见.local symbol.set给一个全局变量或局部...
  • 汇编语言伪指令

    2019-06-29 21:21:41
    指令 (directive) 是嵌入源代码中的命令,由汇编器识别和执行。伪指令不在运行时执行,但是它们可以定义变量、宏和子程序;为内存段分配名称,执行许多其他与汇编器相关的日常任务。 默认情况下,伪指令不区分...
  • ARM指令集 数据操作 ARM指令的种类 数据处理指令 程序状态寄存器与通用寄存器之间的传送指令 Load/Store指令 转移指令 异常中断指令 协处理器指令 数据处理指令分为6类 ...数据传送指令 ... MO
  • [转载] 32位汇编指令笔记

    万次阅读 2020-01-19 21:48:38
    32位CPU所含有的寄存器有: PQJI~u9te} 4个数据寄存器(EAX、EBX、ECX和EDX) <,\Op=$l3I 2个变址和指针寄存器(ESI和EDI) 2个指针...1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) f*HEw 1、数据寄存器 s ~ Xa...
  • 实验内容 (1)编写程序,完成两个64位数据的加法运算,数据来源和...分配一片地址空间给DATATEST,并初始化位0x23 B START END Debug 参考文章 ARM指令–adc 实现64位加法运算 ARM 学习笔记之19:容易误解的指令BIC
  • 一、实验任务 实验任务(1) 1、使用e命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H 并用D命令查看这些数据是否正确写入 2、用a命令输入P74 页的指令,每一...mo...
  • 51单片机汇编指令

    千次阅读 2013-05-12 19:49:28
    一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX(Move External RAM) 对外部RAM的...
  • 汇编语言常用指令

    2021-01-13 19:59:08
    内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的...
  • 源代码 #include <stdio.h> #include <time.h> int main() ... "mov $0, %%ebx\n\t" /* time(NULL) 的入参 NULL */ "mov $0xd, %%eax\n\t" /* time 的系统调用号 */ ... "mov %%eax, %0\n\t" /*
  • 一、JMP 指令:修改EIP 当前运行的下一条指令 JMP 寄存器/立即数 目标类似: mov EIP,寄存器/立即数 CALL指令: 调用函数 CALL 地址A/寄存器 等价: PUSH 地址B ;保存call的下一条指令地址,压栈,作为... MO...
  • 汇编语言编程全套(含DOS,debug.exe,exit.com,masm)仅在win7 64位系统试用过
  • 1、熟练掌握编写汇编语言原程序的基本方法和基本框架。 2、掌握[bx]访问内存的方法和loop循环指令。 3、熟练使用DEBUG调试程序跟踪循环指令的执行。 二.实验内容 编程:向内存0:200-0:23F依次传送数据0~63 代码...
  • STM32F0Thumb汇编学习

    2022-03-24 18:07:01
    一周掌握STM32汇编指令用法 —;************************************************ ;一周掌握STM32汇编指令用法 ;Project: Light Led © ;MCU: STM32F030C8T6 ;Date: 2022.03.24 ;File: start.s ;Function: ...
  • ARM指令汇编1

    2020-12-05 22:27:20
    学习ARM,就必须要学习ARM指令,ARM指令是CPU提供给我们的接口,是我们打开CPU这个潘多拉魔盒的钥匙。 ARM指令有很多,为了让大家能快速上手,一口君整理了一些对我们最有帮助的指令。keil软件的操作,可以参考第一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 812
精华内容 324
热门标签
关键字:

mo汇编指令