汇编语言基础知识总结(五)

255 阅读3分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。

栈和队列

栈和队列都是数据存储结构,数据结构大致包含以下几种存储结构:

  1. 线性表,还可细分为顺序表,链表、栈和队列;
  • 树结构,包括普通树,二叉树,线索二叉树;
  • 图存储结构
  • 队列结构 :先进先出, 和排队一样
  • 栈存储结构 : 先进后出, 类似于往往杯子里放饼干, 第一个放的最后一个取出

栈作用 :

  • 用于存储临时数据,
  • 对数据进行暂时性保护,不被复写
  • 寄存器不够用时,使用栈临时代替中转

寄存器和栈同样用于存放临时数据, 那么它们两者有什么区别呢?

寄存器类似于全局变量,是个公共容器,可以被所有函数读写,寄存器中的数据容易被覆盖, 常用于短周期使用

栈空间是累加型结构: 如果想要复写第一个放入的数据,必须先将后面存放的数据丢弃, 类似于递归, 适合嵌套数据,这也是为什么函数和函数中的局部变量都存放在栈中的原因

总线

存在的意义, 内存中的数据不能直接运算,必须将其读取到寄存器中进行处理, cpu运算完毕后,将其保存至内存中, 那么这一系列过程中,涉及到数据传输, 那么这三条线就是干这个用的

x86汇编语法

  1. 注释
;我是注释

了解: arm汇编注释同为; 而mips汇编注释为#

  1. 变量取值和赋值(传送指令)
;赋值
mov ax,2000H ;将十六进制2000赋值给十六位寄存器ax  相当于ax=2000H


;取值
mov bx,ax ;将ax中的值取出赋值给bx  相当于bx=ax

无论是x86还是arm传送指令都是mov

存放的数据大小根据使用的寄存器而定, 比如ax是16位寄存器,最大只能存放16位数据,也就是4位十六进制数据

  1. 函数声明

结构如下:

函数名:
	函数体
	ret   ;结尾标记

示例:

print:	;函数名
		mov dx,offset str
		mov ah 9ch 
		int 21h
		
		ret ;函数结尾标记
  1. 函数调用

x86架构中使用关键指令call, ARM架构中使用关键指令bl

x86架构汇编示例:

		call print ;调用print函数
		
		;退出程序
		mov ah 4ch 
		int 21h
		
print:	;函数名
		mov dx,offset str;获取别名对应数据的偏移地址
		mov ah 9ch ;9h表示调用显存 从dx总读取偏移地址对应的数据
		int 21h
		ret

ARM架构汇编代码示例:

.text 
.global _A,_B ;定义两个全局函数 A和B

_A:
	mov x0 ,#0xa0 ;arm汇编中数据用#开头
	bl _B ;调用函数B
	mov x1 ,#0x00
	add x1 ,x0,#0x14 ;x1=x0+0x14
	ret  
	
_B:
	add x0, x0,#0x10
	ret ;返回到bl指令所对应的下一条指令