-
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 程序结束.
-
汇编指令中寻址方式汇总
2020-10-21 17:29:42操作数作为指令的一部分直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 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语言及对应的汇编指令--流程控制语句
2021-04-14 19:47:46本文主要解析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&T1. 分支控制 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 先符号... -
linux汇编指令之数据传输指令mov
2021-05-18 03:05:09这里规定源和目标操作不能都指向存储器位置,从一个存储器位置复制到另一个存储器位置需要两条指令,第一条指令将源操作数加载到寄存器,第二条将寄存器的值写到目标位置指令动作描述MOVS,DDMovb传送字节Movw传送字... -
MODEL-MO相关指令
2020-12-23 05:15:46TG号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:320 操作数的表示方法 符号 表示内容 data 立即数 reg 通用寄存器(AX、BX、CX、DX、BP、SP、SI、DI) seg或segreg 段寄存器(CS、DS、SS、ES) ...汇编语言不区分大小写 ...1 数据传送类指令 1.1 MO -
CSAPP第三章常用汇编指令总结
2020-11-06 22:20:39第三章汇编指令汇总 以下是csapp书中常用的汇编指令的汇总 具体到每一行指令来看,是按照: 指令名称 操作数 功能描述 这样的格式组织的 希望能帮助大家复习,阅读第三章的代码 正文: mov类 movb S,D S->D ... -
汇编指令速查表
2020-12-23 05:15:36一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号... -
汇编语言13---其他指令
2021-11-02 14:55:1416位模式下: 源地址是DS:SI,目的地址是ES:DI 32位模式下: 源地址是DS:ESI,目的地址是ES:EDI MOVSB, MOVSW, MOVSD 作用:移动字符串数据,复制由ESI寄存器寻址的内存地址处的数据到EDI寻址的内存处 ...单独的mo -
ARM汇编伪指令
2021-05-15 16:01:06GNU平台无关符号定义伪指令.global,.local,.set,.equ.global使得符号对连接器可见,变为对整个工程可用的全局变量.global symbol.local表示符号对外部不可见,只对本文件可见.local symbol.set给一个全局变量或局部... -
汇编语言伪指令
2019-06-29 21:21:41伪指令 (directive) 是嵌入源代码中的命令,由汇编器识别和执行。伪指令不在运行时执行,但是它们可以定义变量、宏和子程序;为内存段分配名称,执行许多其他与汇编器相关的日常任务。 默认情况下,伪指令不区分... -
汇编(二)——ARM数据处理指令——算术运算、数据传送
2022-03-25 13:51:11ARM指令集 数据操作 ARM指令的种类 数据处理指令 程序状态寄存器与通用寄存器之间的传送指令 Load/Store指令 转移指令 异常中断指令 协处理器指令 数据处理指令分为6类 ...数据传送指令 ... MO -
[转载] 32位汇编指令笔记
2020-01-19 21:48:3832位CPU所含有的寄存器有: PQJI~u9te} 4个数据寄存器(EAX、EBX、ECX和EDX) <,\Op=$l3I 2个变址和指针寄存器(ESI和EDI) 2个指针...1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) f*HEw 1、数据寄存器 s ~ Xa... -
【ARM汇编学习实例】ARM指令使用实验
2021-04-14 10:29:13实验内容 (1)编写程序,完成两个64位数据的加法运算,数据来源和...分配一片地址空间给DATATEST,并初始化位0x23 B START END Debug 参考文章 ARM指令–adc 实现64位加法运算 ARM 学习笔记之19:容易误解的指令BIC -
实验2 用机器指令和汇编指令编程
2018-11-01 18:54:00一、实验任务 实验任务(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所含有的... -
C语言嵌入汇编指令(asm)查询系统时间
2020-07-22 14:06:41源代码 #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" /* -
汇编语言:比较指令、跳转指令、JCC
2019-04-27 08:15:41一、JMP 指令:修改EIP 当前运行的下一条指令 JMP 寄存器/立即数 目标类似: mov EIP,寄存器/立即数 CALL指令: 调用函数 CALL 地址A/寄存器 等价: PUSH 地址B ;保存call的下一条指令地址,压栈,作为... MO... -
汇编语言编程全套(含DOS,debug.exe,exit.com,masm)
2018-10-11 20:43:04汇编语言编程全套(含DOS,debug.exe,exit.com,masm)仅在win7 64位系统试用过 -
汇编实验四 [bx]和loop指令的联合使用
2019-11-07 21:35:041、熟练掌握编写汇编语言原程序的基本方法和基本框架。 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软件的操作,可以参考第一...