概述
博客简介
本篇博客介绍汇编语言中常用的语句以及逻辑实现,主要包括:
- 栈操作pop 和push
- 算术逻辑操作
- 跳转指令
- 标志位指令
- 有条件传送指令
- 循环指令
栈操作pop push
在每个程序所分配的内存中,划分出一段连续的 区域,作为栈空间:
- 栈顶指针:保存在%esp寄存器中
- 压栈操作:push
- 弹栈操作:pop
- 示意图:
- 数值在内存中反向存储:
- 代码示例:
.section .data
value:
.int 0x87654321
.section .text
.global _start
_start:
nop
pushl $0x88888888
#pushw $0x66666666
movl $0x12345678,%ebx
push %ebx
#pushl %ebx
pushw %bx
pushw value
push $value
#pushb %ah
popl %ebx
popl %eax
popw %cx
算术逻辑操作指令
- 一般算数/逻辑指令
指令 | 功能 |
---|---|
incl | 加1操作 |
ecl | 减1操作 |
SHR | 逻辑右移 |
negl | 取负 |
notl | 取反 |
SHL | 逻辑左移 |
al S, | 加法 |
al S, | 加法 |
subl S, | 减法 |
al S, | 加法 |
SHA | 算术右移 |
imull S, | 乘 |
xorl S, | 异或 |
SAL | 算术左移 |
orl S, | 或 |
anl S, | 与 |
- 特殊算术指令
指令 | 功能 |
---|---|
imull S | 有符号乘法——将S与%eax中的值相乘,64位结果的高32位放%ex,低32位放 %eax |
mull S | 无符号乘法——将S与%eax中的值相乘,64位结果的高32位放%ex,低32位放 %eax |
clt S | 将%eax中的值按符号位扩展的方式转换为64位值,高32位放%ex,低32位放%eax |
iivl S | 有符号除法——R[%ex] = R[%ex]:R[%eax] % S; R[%eax] = R[%ex]:R[%eax] / S; |
ivl S | 无符号除法——R[%ex] = R[%ex]:R[%eax] % S; R[%eax] = R[%ex]:R[%eax] / S; |
跳转指令jmp
跳转指令分为直接跳转指令和条件跳转指令,直接跳转指令不需要条件,直接跳转到相应的位置。而条件跳转指令则需要满足相应的条件。
(1)直接跳转
- %eip:存放下一条要执行指令的地址
- jmp lable:跳转到lable指向的地址
-
- jmp *lable:跳转到lable自身的地址
- jmp 0x0804909a :跳转到绝对地址
- jmp *%eax :跳转到以%eax为地址的内存所代表的的地址(和jmp %eax等价,但是后者会警告)
- jump exit:跳转到exit标识出的地址
- jump 8exit:跳转到exit自身的地址
- 代码举例:
.section .data
value:
.int 0x87654321
.section .text
.global _start
_start:
nop
movl $0x0804807e,%eax
subl $1,%eax
incl %ebx
jmp exit
incl %eax
jmp *exit
exit: movl $1, %eax
int $0x80
- 输入指令objdump -d 1014.s,查看代码区,可以看到每一条指令的地址
- 以上代码由于在执行无条件跳转jump *%eax时,eax中存储的地址是0x804807d,是上一条指令在代码区的地址,所以将造成一个无线循环
(2)条件跳转指令
以上的jmp是无条件跳转,如果我么想要有条件跳转,则使用条件跳转指令,规则如下:
- 条件标识符存储在%eflags寄存器中:
- CF:进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0;
- PF:奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0;
- AF:辅助进位标志位。运算过程中看最后四位,不论长度为多少。最后四位向前有进位或者借位,AF=1,否则AF=0;
- ZF:零标志位。相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0;
- SF:符号标志位。相关指令执行后结果为负那么SF=1,结果非负数则SF=0;
- TF:调试标志位。当TF=1时,处理器每次只执行一条指令,即单步执行;
- IF:中断允许标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断;
- DF:方向标志位。在串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;注意此处DF的值是由程序员进行设定的 cld命令是将DF设置为0,std命令是将DF设置为1;
- OF:溢出标志位。记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0;
条件传送指令
最后
以上就是迷人大神为你收集整理的常用汇编指令的全部内容,希望文章能够帮你解决常用汇编指令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复