上一篇筆記:https://www.cnblogs.com/Tony100K/p/11653755.html
轉移類指令
-
JMP Label 段內直接轉移
-
MOV BX,1200H JMP BX執行完之后 IP=1200H了
-
MOV BX,1200
-
JMP WORD PTR[BX]段內間接轉移,1200和1201這兩個單元送給了IP
-
段間轉移也是32位 JMP FAR Label
-
間接轉移 JMP DWORD PTR[BX] DWORD指32位
-
-
低地址送IP,高地址送CS
-
條件轉移范圍只有 -128到127
-
-
-
統計內存數據段中以TABLE為首地址的100個8位帶符號數中的正數\負數和零的個數
-
START: XOR AL,AL MOV PLUS,AL MOV MINUS,AL MOV ZERO,AL LEA SI,TABLE MOV CX,100 CHECK: LODSB OR AL,AL JS X1 JS X2 INC PLUS JMP NEXT X1: INC MINUS JMP NEXT X2: INC ZERO NEXT: DEC CX JNZ CHECK HLT
循環控制指令
-
范圍也非常小 是-128-127的
-
循環次數CX
-
無條件循環LOOP 只要CX不等於0
-
LOOPZ CX不等於0,ZF等於1繼續循環
-
LOOPNZ CX不等於0,ZF等於0繼續
-
在以DATA為首地址的內存數據段中,存放有200個16位有符號數,找出其中最大和最小的符號數,並分別放在MAX和MIN為首的內存單元中
-
START: LEA SI,DATA MOV CX,200 CLD LODSW MOV MAX,AX MOV MIN,AX DEC CX NEXT: LODSW CMP AX,MAX JG LARGE CMP AX,MIN JL SMALL JMP GOON LARGE: MOV MAX,AX JMP GOON SMALL: MOV MIN,AX GOON: LOOP NEXT HLT
過程調用指令
- 段內調用
- CALL TIMER
- CALL WORD PTR[SI]
- SI后的兩位送給IP
- 段間調用
- CALL FAR TIMER
- CALL DWORD PTR[SI]
- RET 返回指令,子程序的最后一條指令必須是RET
中斷控制指令
- 是一個遠過程調用,需要記錄FLAGS
- INT n之后n*4就是存放中斷服務子程序入口地址的單元偏移地址
*
執行過程
- FLAGS壓棧
- INT 指令的下一條指令的CS\IP壓棧
- n*4得到存放中斷向量的地址
- 將中斷向量送給CS IP
- 轉入中斷服務程序
處理器控制指令
標志位操作
-
CLC 清零標志位
-
STC 置1標志位
-
CMC 取反C
-
CLD
-
STD
-
CLI 關中斷
-
STI IF置1 開中斷
匯編語言源程序
過程
- 輸入匯編語言源程序 .ASM
- 匯編 .OBJ
- 鏈接 .EXE
- 調試 最終環境
語句類型
- 指令性語句 CPU執行的語句
- 指示性語句 不執行 告訴匯編程序定義了多大內存等作用
格式
-
[標號:][前綴]助記符[操作數],[操作數][;注釋]
-
偽指令助記符 操作數[,操作數,...][;注釋]
常量
- 數字常量
- 字符串常量 'ABCD' 匯編時被譯成對應的ASC碼
變量 內存單元的符號地址
- 段值 變量所在的段地址
- 偏移量 變量所指單元的偏移地址
- 類型
表達式
-
算術 邏輯 關系運算
-
取值運算符
-
OFFSET 獲得變量或者標號的偏移地址
-
SEG 獲得變量或者標號的段地址
-
MOV AX,SEG 去變量的段地址送給DS MOV DS,AX MOV BX,OFFSET DATA 取變量的偏移地址送給BX
-
屬性運算符
-
MOV BYTR PTR[BX],12H 字節12H MOV WORD PTR[BX],12H 字0012H
-
偽指令
作用
- 定義變量
- 分配存儲器
- 定義邏輯段
- 指示程序開始和結束
- 定義過程
數據定義偽指令
指令助記符 | 大小 |
---|---|
DB | 1字節 |
DW | 1字 |
DD | 2字 |
DQ | 4字 |
DT | 10字 |
第二行的11H就相當於0011H
第三行的22H就是00000011H
注意高位對應高地址
DATA1 DB 'ABCD',66H 注意'ABCD'是四個變量
重復操作符
為一個區域各單元設置相同的初值
M1 DB 10 DUP(0)
定以一個以M1為首地址的10個字節單元,並且每個字節單元的初值都是0
MEM1 DB 34H,'A',?(問號表示一個隨機數,占1個字節單元)
DW 20 DUP(?) 40個單元的隨機值
符號定義偽指令
- EQU 用一個符號代替表達式
- 符號名 EQU 表達式
- EQU不會占用內存空間
段定義偽指令
-
說明邏輯段的起始和結束
-
說明不同程序模塊中同類邏輯段之間的練習形態
-
SEGMENT [定位類型][組合類型][類別]
ENDS
-
-
DATA SEGMENT MEM1 DB 11H,22H MEM2 DB 'HELLO' MEM3 DW 2 DUP (?) DATA ENDS
-
段名也表示邏輯段的段地址
-
變量在邏輯段中的位置就代表了它的偏移地址
設定段寄存器偽指令
- ASSUME 段寄存器名:段名
結束偽指令
- END [標號]
- 只有代碼段不需要初始化
過程定義偽指令
過程名 PROC [NEAR/FAR] (段內/段外)
RET 負責返回斷點
過程名 ENDP
-
過程名是過程體的入口地址
-
DELAY PROC PUSH BX PUSH CX MOV BL,2 NEXT:MOV CX,4167 W10M:LOOP W10M DEC BL JNZ NEXT//一共循環了2*4167次 POP CX POP BX RET DELLAY ENDP
-
CALL DELAY 調用延時子程序
宏定義偽指令
-
與過程不同,不能成為一段可以獨立執行的代碼,只能和源程序一起用
-
宏命令名 MACRO <形式參數>
ENDM
-
DADD MACRO X,Y,Z MOV AX,X MOV AX,Y MOV Z,AX ENDM
-
DADD DATA1,DATA2,SUM 來進行調用
-
形參和實參的位置必須一一對應
調整偏移量偽指令
ORG 表達式(要求計算結果為非負常數)
DATA SEGMENT
ORG 1200H
BUFF DB 1,2
DATA ENDS
這樣,BUFF的偏移地址就變成了1200H
系統功能調用
- BIOS 駐留在ROM的基本輸入輸出系統
DOS(磁盤操作系統)功能調用的基本步驟
- 將調用參數裝入指定的寄存器
- 將功能號裝入AH
- 按中斷類型號調用DOS中斷
- 檢查返回參數是否正確
MOV AH,功能號
<置相應參數>
INT 21H
單字符輸入
MOV AH,01
INT 21H
可以敲一下鍵,鍵在AL中
GET KEY:MOV AH,1
INT 21H
CMP AL,'Y'
JZ YES
CMP AL,'N'
JZ NO
JMP GET KEY
字符串輸入
-
AH<-- 功能號10
-
DS:DX<---字符串在內存中的存放地址
-
DAT1 DB,20,?,20,DUP(?)//在數據段中定義 LEA DX,DAT1 MOV AH,0AH INT 21H
單字符輸出
-
MOV AH,2 MOV DL,41H INT 21H
字符串輸出
- AH=09H
- 被顯示的字符串必須以'$'為結束
返回操作系統功能
- 功能號 4CH
- 常用於程序結尾處