- 本文用于自我复习汇编语言,参考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)]



















