[TOC]
# **汇编指令**
## **move指令**
| 指令形式 | 例子 |
| --- | --- |
| mov 寄存器,数据 | mov ax,8 |
| ~~mov 段寄存器,数据~~ | ~~mov ds,8~~ |
| mov 寄存器,寄存器 | mov ax,bx |
| mov 寄存器,段寄存器 | mov ax,ds |
| mov 段寄存器,寄存器 | mov ds,ax |
| ~~mov 段寄存器,段寄存器~~ | ~~mov ds,cs~~ |
| mov 寄存器,内存单元 | mov ax,[0] |
| mov 内存单元,寄存器 | mov [0],ax |
| mov 内存单元,段寄存器 | mov [0],ds |
| mov 段寄存器,内存单元 | mov ds,[0] |
| | |
| | |
**实例**
![](https://img.kancloud.cn/92/7c/927c1baa4e846e490dd8fb9028b5adfd_909x295.png)
| 指令形式 | 例子 |
| --- | --- |
| add 寄存器,数据 | add ax,8 |
| add 寄存器,寄存器 | add ax,bx |
| add 寄存器,内存单元 | add ax,[0] |
| add 内存单元,寄存器 | add [9],ax |
| ~~add 内存单元,内存单元~~ | ~~add [9],[0]~~ |
| 段寄存器是不能参与add和sub运算的,内存单元只能是一个 | |
| | |
| | |
| | |
| | |
## **add加指令:满16进1**
![](https://img.kancloud.cn/d8/45/d8453171fee2391dca6e607888eee60b_712x329.png)
## **sub减指令:向前借1增16**
![](https://img.kancloud.cn/eb/36/eb36eec18a0ec040df33cb44e46ebaf3_707x325.png)
## **小结**
加法满16进1
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| --- | --- |--- | --- |--- | --- |--- | --- |--- | --- |--- | --- |--- | --- |--- | --- |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
汇编命令不区分大小写
![](https://img.kancloud.cn/8f/76/8f76eca2cf8d1d1ffc48f15d41d0df7c_861x397.png)
![](https://img.kancloud.cn/13/c7/13c7efefbe4af4b3a69342a72d1d31ec_879x502.png)
## **实操**
必须将汇编命令写入CS寄存器(相当于特殊段地址)和IP(相当于偏移地址)指定的内存里
t会向下逐个执行汇编命令,那么执行后怎么才能重置到自己想执行汇编命令的位置?如跳回到`mov ax,1000`jmp 073f:100
![](https://img.kancloud.cn/2c/99/2c9973bdf5aec7728d79f05eef96912d_889x482.png)
![](https://img.kancloud.cn/44/e3/44e3676e475d8860b5412780cdb28ff9_896x569.png)
![](https://img.kancloud.cn/34/26/3426408810a01b6491b51a31cf533579_899x242.png)
## **栈操作**
栈特点:后进先出
### **入栈:push**
将会一个新的元素放到栈顶
| 指令形式 | 例子 |
| --- | --- |
| push 寄存器 | push ax |
| push 段寄存器 | push ds |
| push内存单元 | push [0] |
| | |
从栈顶取出一个元素
### **出栈:pop**
| 指令形式 | 例子 |
| --- | --- |
| pop 寄存器 | pop ax |
| pop 段寄存器 | pop ds |
| pop 内存单元 | push [0] |
| | |
# **伪指令**
## **assume :假设**
这条伪指令的含义为“假设”。它假设某一段寄存器和程序中的某一个用segment...ends定义的段相关联。通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。
assume并不是一条非要深入理解不可的伪指令,以后我们编程时,记着用assume将有特定用途的段和相关的段寄存器关联起来即可。
## **end:汇编程序结束标记**
汇编程序的结束标记。若程序结尾处不加end ,编译器在编译程序时,无法知道程序在何处结束。
## **段名+segment [...] 段名+ends:段定义**
我们在前面的课程中所讲解的段的概念,在汇编源程序中得到了应用与体现,一个源程序中所有将被计算机所处理的信息:指令、数据、栈,被划分到了不同的段中。
一个汇编程序是由多个段组成的,这些段被用来存放代码数据,或当作间来使用。
一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
```
assume cs:codesg
codesg segment
mov ax,0123H
... ...
codesg segment
end
```
```
;特殊段的关联
assume cs:codesg,ds:data,ss:stack
;数据段
data segment
dw 0123H,0456H,0789H,0abcH,odefH
data ends
;栈段
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
;代码段
codesg segment
mov ax,stack
mov ss,ax
mov sp,20h ;设置栈段
mov ax,data
mov ds,ax ;设置数据段
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
... ...
codesg segment
end
```