- 本文用于自我复习汇编语言,参考b站一位老师的讲解整理而成,感谢老师的无私付出
- 视频链接链接
文章目录
- 1.第一章
- 1.1计算机组成
- 1.2读取
- 1.3 寄存器及数据存储
- 1.4 mov和and指令
- 1.5 确定物理地址
- 1.6 内存分段表示法
- 1.7debug使用
- 1.8CS:IP
- 1.9jmp指令改变csip
- 1.10内存中字的存储
- 1.11DS寄存器实现字的传送
- 1.12DS与数据段
- 1.13栈结构:star:
- 1.14段总结
- 2.第四章
- 1.导学
- 2.源程序
- 3.debug跟踪程序
- 4.[...]和()
- 5.Loop指令
- 6.Loop指令例子
- 7.段前缀
- 8.在代码段中使用数据
- 9.在代码段中使用栈
- 9.在代码段中使用栈
1.第一章
1.1计算机组成
1.2读取
如何看待寻址空间?
准确来说,地址能表示2的n次方为位,而
内存
中存储数据都是按字节
存储的,因此寻址能力为Byte,而不是bit
1.3 寄存器及数据存储
1.4 mov和and指令
1.5 确定物理地址
二进制数据左移四位,十六进制左移一位即可
总结:
1.6 内存分段表示法
1.7debug使用
-
二进制数据有可能是数据也有可能是指令
取决于人的看法
-
a命令
直接把汇编指令写进去 -
T命令
1.8CS:IP
CS:IP
表示代码段执行的位置
地址中的数据都是按字节存储,相应位置地址是按字节存储
ASCII码的值都是按一个
字节
存储,其他字符可能按不同的字节数
存储
-
执行过程
-
总结
1.9jmp指令改变csip
CS:IP
目前只有两种方式改变一种是debug中的R命令,一种是jmp指令
后面补充
Loop指令
,改变ip
-
概述
-
jmp指令
-
实例
- 死循环
1.10内存中字的存储
-
字节
读取的时候先读高地址,再读低地址单元数据
16位为一个字
,一个字节8位 -
字单元
1.11DS寄存器实现字的传送
DS:
数据段
寄存器DS: 寄存器不能
直接
赋值
-
往DS寄存器中送入值的操作
-
例:
ax为16位,因此传输一个字的数据
1.12DS与数据段
-
DS取数据的方式
-
累加例子:
-
mov指令操作数据⭐️
add/sub指令
-
小结:⭐️
1.13栈结构⭐️
-
概述
栈,出入栈都是以
字
为单位入栈操作:高地址是栈底,低地址是栈顶,输入的时候是字型输入,高8位放高地址,低8位放低地址
-
关键点:
-
怎么划定栈的区域和push值?
①SS:SP 确定栈顶的位置,SS:0确定栈底位置(与数据结构栈定义相反)
②push值,是从栈底开始push,高地址对应寄存器中的高地址
-
同等的push和pop实现了什么目的?
交换数据,比如下图中ax和bx值就做到了交换
-
栈溢出
入栈和出栈都要注意这个问题,防止入栈导致栈底溢出,出栈导致栈顶溢出。
-
Push和Pop实质上是一种数据传输指令,明白其传输过程中是以字传输即可。
-
-
总结
1.14段总结
-
总结:
三个段地址ds,ss,cs可以共用一块内存空间,详细见例题二
ds:[address]
ss:sp
cs:ip
-
例题
2.第四章
1.导学
2.源程序
-
汇编程序 = 汇编指令 + 伪指令
-
伪指令
assume指令指定数据或代码到段位置
-
如何写出一个程序?
-
程序中可能出现的错误
3.debug跟踪程序
-
例子
注意CS代码段位置和源程序装载位置
-g=加上地址,执行到哪结束
-
程序执行的不同方式
4.[…]和()
[]
表示一个内存单元,[]
表示内存内容
()
为了方便手写,()
表示内存内容只能用
物理地址
或者寄存器表示
-
idata
表示常量
一个例子
,记住ax
是字操作,al
是字节操作
5.Loop指令
注意点
①要用到
CX
寄存器记数
②需要标记循环位置,
定义标号
③Loop指令也能改变IP的值
还要注意:在文本中编写,不写数据H的话,默认数据为十进制
-
概述
6.Loop指令例子
在
汇编程序
中,数据不能以字母开头,需要在字母前加上0
7.段前缀
出现问题:
在debug时,在a命令输入
mov ax,[0]
认为从ds数据段取数据而在编译汇编源程序时,
mov ax,[0]
编译之后被认为为mov ax,0了,与之前不一样因此引入
段前缀
-
概述
-
例子
bx
用来表示偏移地址,相当于一个变量
,存储不断变化的偏移地址段前缀的使用===> 用来表示
不同段
8.在代码段中使用数据
问题:前面直接访问自己指定的
物理地址
是很危险的事情,因为在计算机中不同的地址可能有特殊的功能,不能随意修改
解决:在程序执行中,
操作系统会为程序分配一定的空间
,程序包含了代码段、数据段等,这些地址存放数据
是安全的
-
概述
-
①dw是一个伪指令,表示定义的是字形数据
②默认存储数据从
代码段偏移位置为0
的位置存储③
BX寄存器存储偏移地址
,每次偏移地址 + 2例子
问题:
存储数据在代码段起始,而程序执行的之后默认从代码段起始位置执行,导致
数据被当成了指令
-
解决问题
在CS段中,加上类似
start
的标号,用来指定程序的起始位置
9.在代码段中使用栈
5549790)]
问题:
存储数据在代码段起始,而程序执行的之后默认从代码段起始位置执行,导致
数据被当成了指令
[外链图片转存中…(img-BlsphVL6-1683215549790)]
-
解决问题
在CS段中,加上类似
start
的标号,用来指定程序的起始位置
[外链图片转存中…(img-h8pISVFs-1683215549791)]