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



















