[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] |
| | |
| | |
**實例**

| 指令形式 | 例子 |
| --- | --- |
| 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**

## **sub減指令:向前借1增16**

## **小結**
加法滿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 |
匯編命令不區分大小寫


## **實操**
必須將匯編命令寫入CS寄存器(相當于特殊段地址)和IP(相當于偏移地址)指定的內存里
t會向下逐個執行匯編命令,那么執行后怎么才能重置到自己想執行匯編命令的位置?如跳回到`mov ax,1000`jmp 073f:100



## **棧操作**
棧特點:后進先出
### **入棧: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
```