心得:建议不要只对着书或者资料看,可以直接结合程序来看,在网上找几个简单汇编程序,然后找我们此时所学的知识该程序是如何应用的。当然自己去编写程序也是非常重要的,只不过该方法在刚开始学会比较慢,可以学一部分之后再开始尝试写程序。

基础命令

在学习前期时,我们只需要掌握这四条命令就可以了

1
2
3
4
mov ax,0        ;将0送入ax寄存器,即ax=0
mov ax,bx ;将bx中的数据送入ax中,即ax=bx
add ax,3 ;将ax的数据加一,即ax=ax+3
inc ax ;ax的数据加一,即ax=ax+1

物理地址

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位的数据(基于王爽的汇编语言)。在使用过程中有一下几种情况:

  1. 我们直接使用通用寄存器:

将bx的数据送入ax中
mov ax,bx
2. 使用通用寄存器修改ds,和es寄存器。
将数据2送入ds段寄存器中
mov ax,2
mov ds ax

变址寄存器

SI是源变址寄存器,DI是目的变址寄存器,后面会详细介绍

段寄存器

每一个段寄存器都起着非常重要的作用,我们需要记住每一个是用于什么。

CS寄存器

存储代码段的起始地址。

在计算机中,数据和命令都是二进制数,但是计算机无法区分,因此需要一个指针,直接指向要执行的命令。
CS:IP就是指向当前要执行的语句的地址,执行完ip的值会变为下一条语句的偏移地址

修改cs和ip的值:

  1. Jmp 段地址:偏移地址。修改cs为段地址,ip为偏移地址。
    JMP 1000:100等价于cs=1000 ip=100
  2. Jmp 某一寄存器。修改ip为改寄存器的值。
    JMP ax 等价于 ip=ax

SS寄存器

存储堆栈段的起始地址。

与SP寄存器结合使用,SS:SP指向栈顶元素,与pop,push修改sp的值

1
2
3
4
出栈
pop ax将ax的数据送入栈顶,此时sp=sp+ax中数据的长度
进栈
push ax将栈顶元素送入ax中,此时sp=sp-栈顶元素长度

DS ES寄存器

DS:存储数据段的起始地址。
ES:通常用于存储额外的数据段的起始地址。

两者用法类似。
DS:[….]表示指向一个地址的数据.中括号中可以为常数,也可以为一个通用寄存器。

1
2
3
4
1000:100的数据送入ax中:
mov ax,1000 ;先把1000送入ax再送入ds寄存器
mov ds,ax
mov ax,ds:[100] ;将1000100的数据送入ax中