一.數(shù)制
真值數(shù)和補(bǔ)碼數(shù)之間的轉(zhuǎn)換方法 : [[X]補(bǔ)]補(bǔ) = X
設(shè)設(shè)機(jī)器數(shù)字長(zhǎng)n, 則n位補(bǔ)碼數(shù),
**有符號(hào)數(shù)真值范圍為 -2^n-1^ ~ +2^n-1^-1**
**無符號(hào)數(shù)其數(shù)值范圍為** 0~2^n^-1
<center>常用ASCII碼</center>
| 原數(shù)字 | ASCII(D) | ASCII(H) |
|---|---|---|
| 0 | 48 | 30H |
| A | 65 | 41H |
| a | 97 | 61H |
| CR(回車) | 13 | 0DH |
| 換行 | 10 | 0AH |
二.基本結(jié)構(gòu)
字長(zhǎng):字長(zhǎng)是微處理器一次可以直接處理的二進(jìn)制數(shù)碼的位數(shù)
實(shí)模式特點(diǎn)
- 加電復(fù)位之后,486自動(dòng)工作在實(shí)模式,系統(tǒng)在DOS管理下
- 實(shí)模式下,486只能訪問第一個(gè)1M(==220==)內(nèi)存(00000H - FFFFFH)
- 存儲(chǔ)管理部件對(duì)存儲(chǔ)器只進(jìn)行分段管理,沒有分頁(yè)功能,一個(gè)邏輯段最大容量為==64K==
- 實(shí)模式下,段寄存器中存放段基址
保護(hù)模式特點(diǎn):
- 支持多任務(wù)操作系統(tǒng)
- 保護(hù)模式下,可以訪問4G(232)物理存儲(chǔ)空間
- 采用分段和分頁(yè)功能
三個(gè)存儲(chǔ)地址空間:
- 邏輯空間 可以達(dá)到246=64T
- 線性空間
- 物理空間
馮諾以曼體系
CPU: 運(yùn)算器和控制器
主要包括以下幾個(gè)部分:存儲(chǔ)器、運(yùn)算器、控制器、輸入設(shè)備、輸出設(shè)備
486內(nèi)部結(jié)構(gòu)
<center>常用通用寄存器</center>

指令 = 操作碼 + 操作數(shù)
32位微處理器地址空間
- 物理空間:程序的運(yùn)行空間,即主存空間,在486中,共32條地址線,內(nèi)存最大容量為4G
- 虛擬空間: 編程空間,虛擬存儲(chǔ)器是一項(xiàng)硬件和軟件相結(jié)合的技術(shù)。
狀態(tài)標(biāo)志寄存器
8086標(biāo)志寄存器共有15個(gè)標(biāo)志位置,分為兩類 狀態(tài)標(biāo)志 和 控制標(biāo)志
1.條件(狀態(tài))標(biāo)志
進(jìn)位標(biāo)志: A標(biāo):低半字節(jié)位是否出現(xiàn)借位或者是進(jìn)位,有為1,無為0
輔助進(jìn)位: C標(biāo):最高為值是否出現(xiàn)借位或者是進(jìn)位,是為1,無為0
O標(biāo):是否溢出,是則1,無則0,如果最高位不同,一定不會(huì)溢出。
Z標(biāo):結(jié)果是否為0,是則1,無則0
P標(biāo):運(yùn)算結(jié)果低8位中1結(jié)果的1的次數(shù)是否為偶數(shù),是則1,否則0
S標(biāo):最高位是否為1,是則1,否則0
2.控制標(biāo)志
TF標(biāo):設(shè)置為1時(shí),CPU進(jìn)入單步模式,所謂單步模式就是CPU在每執(zhí)行一步指令后都產(chǎn)生一個(gè)單步中斷
IF標(biāo)志:IF為1時(shí),CPU允許響應(yīng)外部的可屏蔽中斷請(qǐng)求。I=0的時(shí)候屏蔽
DF標(biāo):。使用CLD指令清0, DF為1時(shí),串操作指令按遞減方式改變有關(guān)[存儲(chǔ)器](https://baike.baidu.com/item/存儲(chǔ)器)指針值,每次操作后使SI、DI遞減。
實(shí)模式下物理地址的形成
- 邏輯地址是程序員賦予的,是不唯一的
- 物理地址是唯一的,不同的邏輯地址可以表示一個(gè)物理地址
| 邏輯段 | 段基址存放在 | 偏移地址存放在 |
|---|---|---|
| 代碼段 | CS | IP |
| 堆棧段 | SS | SP |
| 數(shù)據(jù)段 | DS | 根據(jù)不同的尋址方式BX、BP、SI、DI |
| 附加段 | ES/FS/GS | 根據(jù)不同的尋址方式BX、BP、SI、DI |
CS、IP的初值: 由操作系統(tǒng)賦值
SS、SP的初值:
- 程序員賦值
- 操作系統(tǒng)賦值
DS/ES/FS/GS的初始值:由程序員賦值
BX/SI/DI/BP的初始值:由程序員賦值
三.匯編基本知識(shí)
a. 操作數(shù)尋址方式:star::star::star::star::star:
指令當(dāng)中的操作數(shù) : 立即數(shù)、 寄存器數(shù)、內(nèi)存操作數(shù)、I\O端口操作數(shù)
那么各個(gè)數(shù)有各個(gè)訪問操作數(shù)的方式:
- 訪問立即數(shù)
- 立即尋址:heavy_check_mark:
- 訪問寄存器數(shù)
- 寄存器尋址:heavy_check_mark:
- 訪問內(nèi)存操作數(shù):
- 直接尋址:heavy_check_mark:
- 間接尋址:heavy_check_mark:
- 基址尋址:heavy_check_mark:
- 變址尋址:heavy_check_mark:
- 基址加變址尋址:heavy_check_mark:
1.立即數(shù)尋址
直接用立即數(shù)進(jìn)行賦值
mov ax, 1000H 將1000H賦值給ax
2.寄存器尋址
直接把一個(gè)寄存器的值送給另一個(gè)寄存器
mov ax,bx ;將bx寄存器的值賦值到ax中
3.直接尋址
-
段寄存器:[偏移地址]
偏移地址用立即數(shù)來表示的為直接尋址
mov al, es:[2CH] 從ES段偏移地址位2CH的單元取數(shù) -> al mov ax, ds:[2000H] 從數(shù)據(jù)段偏移地址為2000H的單元取一字, ->ax -
段寄存器:變量名
mov ax, es:[YY] YY里面的內(nèi)容作為偏移地址
4.間接尋址
又稱間接尋址,間址。操作數(shù)在內(nèi)存單元中,段基址放在段寄存器中,偏移地址在==間址寄存器==當(dāng)中。
地址表示:段寄存器:[間址寄存器]
物理地址 = 段寄存器 * 16 + 間址寄存器
<center><i>表1.間址寄存器和約定訪問邏輯段
| 間址寄存器 | 約定訪問的邏輯段 | |
|---|---|---|
| BP | 堆棧段 SS | 16位尋址方式 |
| BX, SI, DI | 數(shù)據(jù)段 DS | 16位尋址方式 |
| EBP, ESP | 堆棧段 SS | 32位尋址方式 |
| EAX~EDX, ESI, EDI | 數(shù)據(jù)段 DS | 32位尋址方式 |
mov ax, [bx] //約定的默認(rèn)段寄存器為DS, 所以會(huì)訪問 DS:[BX]
5.基址尋址
基址尋址的地址表達(dá)式:段寄存器:[基址寄存器+位移量]
物理地址: 段寄存器 * 16 + 基址寄存器 + 位移量
<center><i>表2.基址寄存器和約定訪問邏輯段
| 變址寄存器 | 約定訪問的邏輯段 | 適用于 |
|---|---|---|
| BP | 堆棧段 | 16位 |
| BX | 數(shù)據(jù)段 | 16位 |
| EBP, ESP | 堆棧段 | 32位 |
| EAX~EDX, ESI ,EDI | 數(shù)據(jù)段 | 32位 |
mov al, [bx + 2] 物理地址:DS * 16 + bx + 2
6.變址尋址
基址尋址的地址表達(dá)式:段寄存器:[比例因子變址寄存器+位移量]*
物理地址 :段寄存器 * 16 + 比例因子 * 變址寄存器 + 位移量
<center><i>表3.變址寄存器和約定訪問邏輯段
| 變址寄存器 | 約定訪問的邏輯段 | 適用于 |
|---|---|---|
| SI, DI | 數(shù)據(jù)段 | 無比例因子,16位尋址 |
| EBP | 堆棧段 | 有比例因子, 32位尋址 |
| EAX~EDX, ESI ,EDI | 數(shù)據(jù)段 | 有比例因子,32位尋址 |
==如何區(qū)別變址和基址尋址?==
我們通過表1和表2可以知道,在基址尋址過程中,我們使用的基址寄存器為BP、BX,而變址寄存器中使用的位SI、DI。所以我們可以作出區(qū)分。
7. 基址+變址尋址
基址尋址的地址表達(dá)式:段寄存器:[基址寄存器 + 比例因子變址寄存器+位移量]*
mov al, [BX + SI + 0250H] 物理地址= DS * 16 + BX + SI + 0250H
末.總結(jié)
mov al, 0120H 立即尋址
mov al, Bl 寄存器尋址
mov AL,DS:[1000H] 直接尋址
mov AL,BUF 直接尋址
mov AL,[BX] 間址尋址
mov AL,[BX+1] 基址尋址
mov AL,[SI+1] 變址尋址
mov AL,[BX+SI] 基址加變址尋址
b. 匯編語(yǔ)言指令
語(yǔ)句是匯編語(yǔ)言匯編和執(zhí)行的單位,匯編語(yǔ)言源程序包括的語(yǔ)句類型位:指令性語(yǔ)句和指示性語(yǔ)句。
標(biāo)號(hào)代表該條指令的符號(hào)地址。
- 指令性語(yǔ)句(符號(hào)指令) :經(jīng)過匯編之后,通知CPU進(jìn)行什么操作。
- 指示性指令
- 偽指令:非機(jī)器指令,是在匯編鏈接期間進(jìn)行操作的
- 宏指令
符號(hào)指令和機(jī)器指令是一一對(duì)應(yīng)的關(guān)系。
1.常用偽指令語(yǔ)句
-
數(shù)據(jù)定義偽指令
-
字節(jié)定義偽指令 : DB(Define Byte的縮寫) 長(zhǎng)度為8位 單字節(jié)數(shù)
N1: DB 12H,64,-1,3*3 DB 'A','B' N2: DB ?,?,? 或者是 DB -
字定義偽指令:DW(Define Word的縮寫) 長(zhǎng)度位16位 雙字節(jié)數(shù)
WNUM: DW 1234H, 56, 'AB', 'C' DW ?,? 匯編后: 34H, 12H, 38H, 00H, 42H( ASCII B), 42H( A's ASCII) , 43H, 00H
-
-
符號(hào)定義指令
-
等值偽指令 : EQU
NUM EQU 33 類似于C語(yǔ)言中的define語(yǔ)句 -
等號(hào)偽指令 : =
NUM = 33EQU和=的區(qū)別,EQU定義的NUM在后繼語(yǔ)句當(dāng)中不能被重新定義,而后者可以被重新定義。
-
2.常用運(yùn)算符
-
$運(yùn)算符
作用:代表所在位置的地址
BUF DB ‘a(chǎn)ssembly is ok’ ;字符串長(zhǎng)度位14 LLL EQU $-BUF ;返回從BUF運(yùn)算符到當(dāng)前位置的長(zhǎng)度,也就是一共分配了多少單元 -
SEG 運(yùn)算符
作用:計(jì)算某一段邏輯段的段基址
mov ax, SEG DATA mov ds ,ax -
OFFSET 運(yùn)算符
作用:計(jì)算某個(gè)變量名和標(biāo)號(hào)名所在單元的偏移量
BUF DB 12H, 34H, 56H MOV BX OFFSET BUF MOV AL, [BX] ;AL = 12H -
PTR 運(yùn)算符
作用:臨時(shí)修改某一單元內(nèi)存的屬性
類型屬性確定的操作數(shù)
- 寄存器操作數(shù)
- 用變量名直接尋址的內(nèi)存操作數(shù)
類型屬性不確定的操作數(shù)
- 立即數(shù)
- 非變量名定義的內(nèi)存操作數(shù)(帶括號(hào))
BUF DB 11H,22H,33H,44H EXAMPLE_1: MOV AX, BUF ;不正確,前后位數(shù)不一樣 MOV AX , WORD PTR BUF ;AH = 22H, AL = 11H EXAMPLE_2: MOV BUF, 1234H ;錯(cuò)誤 MOV WORD PTR BUF, 1234H ;正確,BUF單元變?yōu)?4H, BUF+1單元變?yōu)?2H EXAMPLE_3: MOV BX, OFFSET XX MOV [BX], 12H MOV BYTE PTR [BX], 12H ;將BX單元的內(nèi)容變?yōu)?2H MOV WORD PTR [BX], 12H ;將BX單元的內(nèi)容變?yōu)?2H,將BX+1單元的的內(nèi)容變?yōu)?0H
3.匯編基本指令集
1.通用傳送類指令
-
數(shù)據(jù)傳送指令
mov des , source WARNING: MOV DS, 1000H ;不合法,立即數(shù)不能直接賦值給段寄存器 MOC CS, 1000H ;不合法,不嫩修改CS的值 -
符號(hào)擴(kuò)展指令
MOVSX: 符號(hào)位向高位擴(kuò)展,再送給目標(biāo)操作數(shù)
MOVZX:符號(hào)位高位補(bǔ)0, 再送給目標(biāo)操作數(shù)
movsx DL, -16 ;DL = F0H movsx bx, dl ;bx = FFF0H 符號(hào)位為1,擴(kuò)1 movzx bx, dl ;bx = 00F0H 括0 -
有效地址傳送指令
LEA運(yùn)算符等效于OFFSET運(yùn)算符
lea bx, buf == mov bx, offset buf -
交換指令
XCHG:兩個(gè)操作數(shù)互換;
說明: 段寄存器、 立即數(shù)不能參加互換
2個(gè)內(nèi)存操作數(shù)不能參與互換,前后屬性要一致。
2.堆棧操作類指令

棧頂在棧區(qū)的低地址,棧底在棧區(qū)的高地址。
堆棧段寄存器 SS;
堆棧指針ESP和 SP;
-
進(jìn)棧指令
PUSH 源操作數(shù)SP = SP - 2 高8位 --> SS:[SP+1] 高字節(jié) 低8位 --> SS:[SP] PUSH WORD PTR [BX] ;將DS:[BX]的內(nèi)容壓棧 -
出棧
SP = SP + 2 SS:[SP] -- > 低8位 SS:[SP+1] --> 高8位
3.運(yùn)算類指令
二進(jìn)制加法:
-
加減運(yùn)算法指令 當(dāng)操作數(shù)為內(nèi)存數(shù)的時(shí)候必須使用PTR運(yùn)算符
- INC 目標(biāo)操作數(shù) :加1指令 必須
- DEC 目標(biāo)操作數(shù) :減1指令
-
乘除運(yùn)算類指令
<center><i>表4.乘法功能
MUL/IMUL 被乘數(shù)默認(rèn)在 乘數(shù)為 高位積在 低位積在 字節(jié)相乘 AL R8/M8 AH AL 字相乘 AX R16/M16 DX AX 雙字相乘 EAX R32/M32 EDX EAX <center><i>表5.除除法功能
DIV / IDIV 被除數(shù)默認(rèn)在 除數(shù)為 商值在 余數(shù)在 字節(jié)除法 AX R8/M8 AL AH 字除法 DX=高16位 , AX=低16位 R16/M16 AX DX 雙字除法 EDX=高32位 , EAX=低32位 R32/M32 EAX EDX -
無符號(hào)數(shù)乘法:
MUL 乘數(shù)- 格式一
MUL 目功能:被乘數(shù)默認(rèn)在EAX中 - 格式二
MUL 目 源 - 格式三:
IMUL 目,源, 立即數(shù)源*立即數(shù) = 目標(biāo)操作數(shù)
MOV EAX, 15000 MOV EBX, 12 MUL EBX ;15000*12 --> EAX - 格式一
有符號(hào)乘法:
IMUL 乘數(shù)無符號(hào)除法 DIV
有符號(hào)除法 IDIV
-
-
NEG指令 : 求補(bǔ)運(yùn)算 可以表達(dá)成 取反后 +1, 可以用來求一個(gè)數(shù)的相反數(shù)
MOV AL, 77 NEG AL ;result : AL=-77 -
SBB指令 :除完成SUB減法運(yùn)算外,還要減去借位CF,結(jié)果送到目的操作數(shù),按照定義影響6個(gè)狀態(tài)標(biāo)志位。也就是
SBB dest,src ; 帶借位減法:dest=dest-src-CF -
ADC指令:帶進(jìn)位加法指令 ADC(Addition Carry)
ADC OPRD1,OPRD2 ;OPRD1 = OPED1 + OPRD2 + 1
4.BCD碼調(diào)整指令
-
DAA指令默認(rèn)的操作對(duì)象是AL寄存器,將AL寄存器里面的值變?yōu)锽CD碼
;計(jì)算1234+5678=? 結(jié)果用BCD碼表示 ;數(shù)據(jù)段 N1 DW 1234H N2 DW 5678H SUM DW ? ;代碼段 MOV AL, BYTE PTR N1 ADD AL, BYTE PTR N2 DAA MOV BYTE PTR SUM, AL MOV AL, BYTE PTR N1+1 ADD AL, BYTE PTR N2+1 DAA MOV BYTE PTR SUM+1, AL -
DAS
默認(rèn)操作對(duì)象是AL,對(duì)AL中的組合BCD差值進(jìn)行修正。
- 若被減數(shù)>減數(shù),調(diào)整后,C標(biāo)=0,AL=組合BCD碼差值;
- 若被減數(shù)<減數(shù),調(diào)整后,C標(biāo)=1,AL=差值相對(duì)于模100的補(bǔ)數(shù)。
;計(jì)算56-78 = ? ;數(shù)據(jù)段 MOV AL, 56H SUB AL, 78H DAS ;結(jié)果:C=1,AL=78H
5.轉(zhuǎn)移指令
-
無條件轉(zhuǎn)移
jmp xyz ;無符號(hào)跳轉(zhuǎn)到xyz -
有條件轉(zhuǎn)移
-
無符號(hào)條件轉(zhuǎn)移
CMP N1,N2 ;N1,N2都為無符號(hào)數(shù) JA XYZ ;N1 > N2轉(zhuǎn)移 JNA XYZ ;N1 <= N2轉(zhuǎn)移 JC XYZ ;N1 < N2轉(zhuǎn)移 JNC XYZ ;N1 >= N2轉(zhuǎn)移 JZ XYZ ;為零跳轉(zhuǎn) -
有符號(hào)數(shù)條件轉(zhuǎn)移
CMP N1,N2 ;N1,N2都為有 符號(hào)數(shù) JG XYZ ;N1 > N2轉(zhuǎn)移 JGE XYZ ;N1 <= N2轉(zhuǎn)移 JL XYZ ;N1 < N2轉(zhuǎn)移 JLE XYZ ;N1 >= N2轉(zhuǎn)移
-
-
循環(huán)控制轉(zhuǎn)移 LOOP
;TEST:某班級(jí)40人,某課程成績(jī)存放在SCORE開始的內(nèi)存單元,統(tǒng)計(jì)合格人數(shù) ;數(shù)據(jù)段 SCORE DB XX,XX,XX; OK DB ? ;代碼段 MOV AX, SEG SCORE MOV DS, AX MOV BX, OFFSET SCORE MOV CX, 40 MOV DL, 0 LAST: CMP BYTE PTR [BX], 60 JC NO;如果成績(jī)小于60 INC DL;及格人數(shù)加1 NO: INC BX;偏移地址+1,判斷下一個(gè)人數(shù) LOOP LAST;如果CX=0的時(shí)候,跳轉(zhuǎn)到LAST MOV OK,DL
6.子程序調(diào)用與返回類指令
7.串傳送指令
說明:
- 源串和目標(biāo)串的存儲(chǔ)及尋址方式都有隱含規(guī)定,源串要放在數(shù)據(jù)段,目標(biāo)串要放在ES附加段
- CPU自動(dòng)用SI間址訪問數(shù)據(jù)段,用DI間址訪問ES附加段、用CX做為串計(jì)數(shù)器。
格式:
- 字節(jié)串傳送: MOVSB
- 字串傳送: MOVSW
- 雙字串傳送:MOVSD
功能:把DS:[SI]傳送到ES:[DI]
8.邏輯運(yùn)算指令
| 名稱 | 格式 | 功能 | 影響的標(biāo)志位 |
|---|---|---|---|
| 邏輯與操作 | AND | 與 | S Z P |
| 邏輯或指令 | OR | 或 | S Z P |
| 邏輯非指令 | NOT | 非 | 不影響 |
| 異或指令 | XOR | 異或 | S Z P |
| 測(cè)試指令 | TEST | 測(cè)試 | S Z P |
Test指令:Test對(duì)兩個(gè)參數(shù)(目標(biāo),源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設(shè)置標(biāo)志寄存器,結(jié)果本身不會(huì)保存。
如果結(jié)果為0,那么ZF標(biāo)志位為1 使用JZ跳轉(zhuǎn)
9.移位指令
操作數(shù)智能為cl寄存器或者是立即數(shù)
- 邏輯左移位 : SAL 或 SHL ,低位補(bǔ)0, 進(jìn)位到CF中
- 邏輯右移位: SHR, 高位補(bǔ)0 無符號(hào)數(shù)
- 算術(shù)右移位: SAR ,高位補(bǔ)原來的最高位 符號(hào)位保持不變
-
循環(huán)右邊移位:
image
10.處理機(jī)控制類指令
CLC ;復(fù)位進(jìn)位標(biāo)志:CF←0
STC ;置位進(jìn)位標(biāo)志:CF←1
CLD ;復(fù)位方向標(biāo)志:DF←0
STD ;置位方向標(biāo)志:DF←1
CLI ;復(fù)位中斷標(biāo)志:DF←0
STI ;置位中斷標(biāo)志:DF←1
四.匯編語(yǔ)言程序設(shè)計(jì)
1.完整的源程序結(jié)構(gòu)
- 用方式選擇偽指令來說明該程序的微處理器類型
- 用段定義語(yǔ)句定義每一個(gè)邏輯段
- 用ASSUME語(yǔ)句說明段約定
- 用匯編結(jié)束語(yǔ)句說明源程序到此結(jié)束
.586 ;方式定義 表示整個(gè)源程序經(jīng)過匯編鏈接之后生成哪種CPU類型的機(jī)器指令 向下兼容 如果缺省直接8086
DATA SEGMENT USE16 ;段定義語(yǔ)句,USE16定義,有效對(duì)有效地址為16位,邏輯段長(zhǎng)度最大運(yùn)行為64K 缺省的是USE32 所以在實(shí)模式下不能忘記\
...
DATA ENDS ;段結(jié)束
CODE SEGMENT USE16 ;定義代碼段
ASSUME CS:CODE, DS:DATA ;段約定,用來表示CODE段和CS寄存器進(jìn)行綁定,DATA段和DS寄存器進(jìn)行綁定。
BEG:
MOV AX, DATA
MOV DS, AX
...
MOV AH,4Ch
INT 21H ;程序結(jié)束到此結(jié)束,把操作權(quán)給匯編程序
CODE ENDS
END BEG ;通知匯編程序,源程序到此結(jié)束法,用BEGIN
2. 開發(fā)過程
編輯程序 –> .ASM文件 –> 匯編程序 –> .OBJ文件 –> 鏈接程序 –> .EXE文件
a.asm --> ml /c a.asm --> link a.obj --> a.exe
3.開發(fā)格式
- .exe
- .com 優(yōu)先級(jí)比exe高
異同點(diǎn)
EXE文件:允許源程序使用多個(gè)邏輯段
實(shí)模式下,每個(gè)邏輯段不超過64K
COM文件:源程序只允許一個(gè)邏輯段 就是代碼段
需要使用定位ORG指令將程序的啟動(dòng)指令放在 代碼段偏移地址為100H的單元地址
程序使用的數(shù)據(jù)可以集中在代碼段的開始或者末尾
4.DOS功能調(diào)用
BIOS/DOS調(diào)用模式
MOV AH, 功能號(hào)
設(shè)置入口參數(shù)
INT 21H
分析出口參數(shù)
功能號(hào):
- 01H 等待鍵入一個(gè)字符,有回顯,相映Ctrl_C
- 02H 顯示一個(gè)字符 從DL讀入 但是會(huì)破壞AL寄存器的內(nèi)容
- 07H 等待鍵入一個(gè)字符,無回顯
- 出口參數(shù) : AL=按鍵的ASCII碼
- 08H 等待鍵入一個(gè)字符
- 09H 顯示一個(gè)字符串
- 入口參數(shù): DS:DX = 字符串首地址,字符串必須以 ‘&’(ASCII碼為24H)為結(jié)束符號(hào)
- 0AH 等待鍵入一串字符串送入數(shù)據(jù)緩沖區(qū)
- 入口參數(shù): DS:DX 指向放入的字符的緩沖區(qū)
- 出口參數(shù): 存放于緩沖區(qū)的字符串,以回車鍵結(jié)尾
5.BIOS功能調(diào)用
-
01H 查詢鍵盤緩沖區(qū)
- 出口參數(shù): Z標(biāo)志 = 0 , 有鍵入,鍵代碼仍保留在鍵盤緩沖區(qū)中,此時(shí)AL= 鍵入字符的ASCII碼,AH=鍵入字符的擴(kuò)展碼 Z標(biāo)志=1,表示無鍵入
-
0EH 顯示一個(gè)字符
- 入口參數(shù) 從AL讀入
-
13H 顯示一個(gè)字符串
- 入口參數(shù) 屬性字節(jié)BL ,

5.程序設(shè)計(jì)格式
- 分支程序設(shè)計(jì)
- 循環(huán)程序設(shè)計(jì)
6.子程序設(shè)計(jì)
主
7.宏指令程序設(shè)計(jì)
宏體被COPY一份插入在位置上。是由匯編程序執(zhí)行的。所以不會(huì)減少體積。
宏程序和子程序的異同點(diǎn):
相同點(diǎn):宏指令與子程序都可以簡(jiǎn)化程序設(shè)計(jì),增強(qiáng)程序的可讀性
不同點(diǎn):
- 子程序調(diào)用的是由CPU完成的,宏指令的調(diào)用是在匯編程序中完成的
- 子程序的調(diào)用可以減小目標(biāo)程序的體積,但是宏指令不可以
8.代碼轉(zhuǎn)換
- 十六進(jìn)制轉(zhuǎn)為二進(jìn)制輸出
.586
DATA SEGMENT USE16
MESG DB 'Please Enter!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV BX, DATA
MOV DS, BX
;顯示一行字符串
MOV AH , 9
MOV DX, OFFSET MESG
INT 21H
;輸入一個(gè)字符
MOV AH, 1
INT 21H
;比較字符串
CMP AL, 39H
JNA NEXT1
SUB AL, 7H
NEXT1:
SUB AL,30H
;27行的2號(hào)功能會(huì)破壞AL的值,所以不能使用AL的值
MOV BL, AL
;輸出 = 符號(hào)
MOV AH,2
MOV DL, '='
INT 21H
;輸出二進(jìn)制
CALL DISP
;輸出B
MOV AH,2
MOV DL, 'B'
INT 21H
EXIT:
MOV AH, 4CH
INT 21H
;顯示函數(shù)
DISP PROC
MOV CX,8
LAST:
MOV DL, '0'
RCL BL,1
JNC NEXT
MOV DL, '1'
NEXT:
MOV AH,2
INT 21H
LOOP LAST
RET
DISP ENDP
CODE ENDS
END BEG
-
十六進(jìn)制輸出
.586 ;將BUF單元中的數(shù)字轉(zhuǎn)為16進(jìn)制 DATA SEGMENT USE16 BUF DW 987AH DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA BEG: MOV AX, DATA MOV DS, AX MOV DX, BUF MOV CX, 4 ;算術(shù)左移,低位補(bǔ)0 SAL EDX, 16 AGA: ROL EDX, 4 AND DL, 0FH CMP DL ,10 JC NEXT ADD DL, 7 NEXT: ADD DL, 30H MOV AH, 2 INT 21H LOOP AGA MOV AH, 4CH INT 21H CODE ENDS END BEG -
16進(jìn) 制轉(zhuǎn)為 十進(jìn)制顯示程序
.586 CMPDISP MACRO NN ;設(shè)置一個(gè)宏 LOCAL LAST,NEXT MOV DL,0 LAST: CMP BEN,NN JC NEXT INC DL SUB BEN, NN JMP LAST NEXT: ADD DL,30H ;ASCII ENDM DATA SEGMENT USE16 BEN DW 1287H ;4743 TAB DW 10000,1000,100,10,1 COUNT EQU ($-TAB)/2 ;查看TAB分配了多少單元格 BUF DB COUNT DUP(?),'$';輸出緩沖區(qū) DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA BEG: MOV AX, DATA MOV DS, AX MOV CX, COUNT MOV BX, OFFSET TAB MOV SI, OFFSET BUF AGA: MOV AX, [BX] CMPDISP AX MOV [SI], DL ADD BX, 2 INC SI LOOP AGA MOV SI, OFFSET BUF NOSP: CMP BYTE PTR[SI], 30H JNZ DISP INC SI JMP NOSP DISP: MOV AH, 9 MOV DX, SI INT 21H MOV AH, 4CH INT 21H CODE ENDS END BEG
五.MOOC題目
第一章

第二章

第四章

第五章

第六章

第七章


