我是靠谱客的博主 迷人大神,最近开发中收集的这篇文章主要介绍常用汇编指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

博客简介

本篇博客介绍汇编语言中常用的语句以及逻辑实现,主要包括:

  • 栈操作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;

在这里插入图片描述
在这里插入图片描述

条件传送指令

在这里插入图片描述
在这里插入图片描述

最后

以上就是迷人大神为你收集整理的常用汇编指令的全部内容,希望文章能够帮你解决常用汇编指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部