例1 二進(jìn)制加法程序。
兩個(gè)多字節(jié)的二進(jìn)制數(shù)分別放在以ADD1和ADD2為首地址的存貯單元中,兩個(gè)數(shù)的字長(zhǎng)度放在CONT單元中。最后相加結(jié)果放在以SUM為首地址的單元中。
所有數(shù)的低字節(jié)在前,高字節(jié)在后。
程序如下:
DATA SEGNENT
ADD1 DBFEH,86H,7CH,44H,56H,1FH
ADD2 DB56H,49H,4EH,0FH,9CH,22HSUM DB 6DUP(0)
CONT DB 3
DATA ENDS
STACK SEGMENT PARASTACK′STACK′
DB 100DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME:CS:CODE,DS:DATA,ES:DATA,SS:STACK
MADDB: MOV AX,DATA
MOV DS,AX ;初始化數(shù)據(jù)段寄存器
MOV ES,AX ;初始化輔助段寄存器
MOV SI,OFFSETADD1;被加數(shù)地址→SI
MOV DI,OFFSETADD2;加數(shù)地址→DI
MOV BX,OFFSETSUM;和地址→BX
MOV CL,BYTEPTRCONT
MOV CH,0;初始化相加字長(zhǎng)度
CLCMADDB1:MOV AX,[SI]
ADC AX,[DI] ;16位相加
INC SI
INC SI
INC DI
INC DI
MOV, [BX]AX ;相加結(jié)果送結(jié)果單元
INC BX
INC BX
LOOP MADDB1 ;執(zhí)行循環(huán)
HLT
CODE ENDS
END MADDB
例2 兩個(gè)未壓縮的BCD數(shù)相加程序。
在8088中可以對(duì)兩個(gè)用ASCII碼表示的十進(jìn)制數(shù)直接相加,以得到它們的和。設(shè)被加數(shù)放在SBCD1為首地址的單元中,加數(shù)放在SBCD2為首地址的單元中。
DATA SEGMENT
SBCD1 DB′5′,′6′,′9′,′2′
SBCD2 DB′2′,′3′,′7′,′8′
SSUM DB 4DUP(0)
CONT DB 4
DATA ENDS
STACK SEGMENT PARASTACK′STACK′
DB 200DUP(?)STACK ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA
SBCDAD:MOV AX,DATA
MOV DS,AX
MOV ES,AX
CLC
CLD
MOV SI,OFFSETSBCD1
MOV DI,OFFSETSBCD2
MOV BX,OFFSETSSUMMOV CL,CONT
MOV CH,0
SBCDAD1:LODS SBCD1
ADC AL[DI], ;加法運(yùn)算
AAA
INC DI
MOV BYTEPTR,AL
INC BX
LOOP SBCDAD1
HLT
CODE ENDS
END SBCDAD
例3 二進(jìn)制整數(shù)乘法程序。
兩個(gè)二進(jìn)制整數(shù)相乘,每個(gè)數(shù)的字長(zhǎng)度放在CONT中,被乘數(shù)放在DATA1為首地址的存貯單元中,乘數(shù)放在DATA2為首地址的存貯單元中,乘積放在DATA3為
首地址的存貯單元中。
程序如下:
DATA SEGMENT
DATA1 DW 403EH,1F51H
DATA2 DW 10F5H,111EH
DATA3 DW 4DUP(0)
CONT DW 2
DATA ENDS
STACK SEGMENTPARASTACK′STACK′
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK
MUL: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SI,OFFSETDATA1
MOV DI,OFFSETDATA2
MOV BX,OFFSETDATA3
MOV CX,CONT
CLD
MUL1:PUSH CX
MOV DX,[SI]
INC SIINC SI
PUSH BX
PUSH DI
MOV CX,CONT
MUL2:PUSH CX
PUSH DX
MOV AX,[DI]
INC DI
INC DI
MUL DX
ADD,AX[DI]
INC BX
INC BX
ADC,DXPOP DX
POP CX
LOOP MUL2
POP DI
POP BX
INC BX
INC BX
POP CX
LOOP MUL1
HLT
CODE ENDS
END MUL
例4 二進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼程序。
編制程序,將一個(gè)字長(zhǎng)的二進(jìn)制數(shù)轉(zhuǎn)換成一個(gè)ASCII碼表示的字符串。二進(jìn)制數(shù)放在BINNUM中,其轉(zhuǎn)換結(jié)果放ASCBCD中。
程序如下:
DATA SEGMENT
BINNUM DW 4FFFH
ASCBCD DB 5 DUP(0)
DATA ENDS
STACKSEGMENTPARASTACK′STACK′
DB 200DUP(?)
STACK ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK
BINASC:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,5
XOR DX,DX
MOV AX,BINNUM
MOV BX,10
MOV DI,OFFSETASCBCDBINASC1: DIV BX
ADD DL,30H
MOV [DI],DL
INC DI
AND AX,AX
JZ STOP
MOV DL,0
LOOP BINASC1
STOP: HLT
CODE ENDS
END BINASC
例5 ASCII碼轉(zhuǎn)換成二進(jìn)制數(shù)的程序
將一個(gè)4位ASCII碼數(shù)字轉(zhuǎn)換成二進(jìn)制數(shù),ASCII碼數(shù)字放在以ASCSTG為首地址的內(nèi)存單元中(共有4位),轉(zhuǎn)換結(jié)果放入以BIN為首地址的內(nèi)存單元中。
程序如下:
DATA SEGMENT
ASCSTG DB′5′,′A′,′6′,′1′
BIN DB2DUP(0)
DATA ENDS
STACK SEGMENTPARASTACK′STACK′
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
ASCB: MOV AX,DATA
MOV DS,AX
MOV CL,4
MOV CH,CL
MOV SI,OFFSETASCSTG
CLD
XOR AX,AX
XOR DX,DX
ASCB1: LODS ASCSTG
AND AL,7FH
CMP AL,′0′
JL ERROR
CMP AL,′9′
JG ASCB2
SUB AL,30H
JMP SHORTASCB3ASCB2: CMP AL,′A′
JL ERROR
CMP AL,′F′
JG ERROR
SUB AL,37H
ASCB3: OR DL,AL
ROR DX,CL
DEC CH
JNZ ASCB1MOV WORD PTR BIN,DX
HLT
CODE ENDS
END ASCB
例6 輸入一行字符的輸入程序。
一般從終端可送入80個(gè)字符,再加一個(gè)回車符共81個(gè),程序在回車符后另加1個(gè)換行符,因此放在緩沖區(qū)內(nèi)的字符實(shí)際為82個(gè)?,F(xiàn)假設(shè)接口的接收寄存器地址為52H,
發(fā)送寄存器為53H,狀態(tài)寄存器為54H,并且狀態(tài)寄存器b-0=1時(shí)為發(fā)送就緒,b -1=1時(shí)為接收就緒。在接收數(shù)據(jù)時(shí)要進(jìn)行偶校驗(yàn),如發(fā)現(xiàn)有錯(cuò)則轉(zhuǎn)錯(cuò)誤處理。若輸入
字符超過80個(gè)字符,則輸出緩沖區(qū)溢出信息。
程序如下:
DATA SEGSEGMENT
MESSAGE DB′BUFFEROVERFLOW′,0DH,0AH
DATAS EGENDS
COMSEG SEGMENT
BUFFER DB 82DUP(?)
COUNT DW?
COMSEG ENDS
…CODE SEGMENT
INREG EQU 52H
OUTREG EQU 53H
STATUS EQU 54H
RRDY EQU 00000010B
TRDY EQU 00000001B
… ASSUMEDS:DATASEG,ES:COMSEG
MOV AX,DATASEG
MOV DS,AX
MOV AX,COMSEG
MOV ES,AX
…INPUT80 PROC NEAR
PUSH DI
PUSH SI
PUSH AX
PUSH CX
MOV DI,OFFSETBUFFER
MOV COUNT,DI
MOV CX,81
CLDNEXTIN:IN AL,STATUS
TEST AL,RRDY
JZ NEXTIN
IN AL,INREG
OR AL,0
JPE NOERROR
JMP NEAR PTR ERROR
NOERROR:AND AL,7FH
STOSB
CMP AL,0DH
LOOPNE NEXTINJNE OVERFLOW
MOV AL,0AH
STOSB
SUB DI,COUNT
MOV COUNT,DI
…POP CX
POP AX
POP SI
POP DIRET
OVERFLOW:MOV SI,OFFSETMESSAGE
MOV CX,17
NEXTOUT: IN ALSTATUS
TEST AL,TRDY
JZ NEXTOUT
LODSB
OUT OUTREG,AL
LOOP NEXTOUT
…POP CX
POP AX
POP SI
POP DI
RET
INPUT80 ENDP