心得:建议不要只对着书或者资料看,可以直接结合程序来看,在网上找几个简单汇编程序,然后找我们此时所学的知识该程序是如何应用的。当然自己去编写程序也是非常重要的,只不过该方法在刚开始学会比较慢,可以学一部分之后再开始尝试写程序。
基础命令
在学习前期时,我们只需要掌握这四条命令就可以了
1 | mov ax,0 ;将0送入ax寄存器,即ax=0 |
物理地址
8086物理地址=段地址*16+偏移地址。
记为段地址:偏移地址
两个十六进制合成一个20进制地址
以二进制来看,乘以二就是左移一位。以十六进制表示,乘以十六相当于左移一位。
例:地址1230:C8
123C8H的内存单元 = 12300 + C8 = 段地址(1230)*16 + 偏移地址(C8)
一个段的起始地址一定是16的倍数,偏移地址为16位,则段的长度为64KB(2^16 Byte)
段的起始位置和长度与多少位有关
有哪些寄存器
在计算机中数据都是存储在存储器中,而运算需要寄存器来完成。
在8086CPU中14个的寄存器可以分为以下六类:
通用寄存器:AX,BX,CX,DX
变址寄存器:SI,DI
指针寄存器:SP,BP
指令指针寄存器:IP
段寄存器:CS,SS,DS,ES
标志寄存器:PSW
下面我们为大家介绍常用的寄存器。这里只需要对每一个寄存器有一个大致的了解即可,后面在学习时会不断清晰。
通用寄存器
通常用来存放一次性数据,可以存储一个16位的数据(基于王爽的汇编语言)。在使用过程中有一下几种情况:
- 我们直接使用通用寄存器:
将bx的数据送入ax中
mov ax,bx
2. 使用通用寄存器修改ds,和es寄存器。
将数据2送入ds段寄存器中
mov ax,2
mov ds ax
变址寄存器
SI是源变址寄存器,DI是目的变址寄存器,后面会详细介绍
段寄存器
每一个段寄存器都起着非常重要的作用,我们需要记住每一个是用于什么。
CS寄存器
存储代码段的起始地址。
在计算机中,数据和命令都是二进制数,但是计算机无法区分,因此需要一个指针,直接指向要执行的命令。
CS:IP就是指向当前要执行的语句的地址,执行完ip的值会变为下一条语句的偏移地址
修改cs和ip的值:
- Jmp 段地址:偏移地址。修改cs为段地址,ip为偏移地址。
JMP 1000:100等价于cs=1000 ip=100 - Jmp 某一寄存器。修改ip为改寄存器的值。
JMP ax 等价于 ip=ax
SS寄存器
存储堆栈段的起始地址。
与SP寄存器结合使用,SS:SP指向栈顶元素,与pop,push修改sp的值
1 | 出栈 |
DS ES寄存器
DS:存储数据段的起始地址。
ES:通常用于存储额外的数据段的起始地址。
两者用法类似。
DS:[….]表示指向一个地址的数据.中括号中可以为常数,也可以为一个通用寄存器。
1 | 将1000:100的数据送入ax中: |