第12节 汇编语言举例
例1 二进制加法程序。
两个多字节的二进制数分别放在以ADD1和ADD2为首地址的存贮单元中,两个数的字长度放在CONT单元中。最后相加结果放在以SUM为首地址的单元中。
所有数的低字节在前,高字节在后。
程序如下:
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 ;初始化数据段寄存器
MOV ES,AX ;初始化辅助段寄存器
MOV SI,OFFSETADD1;被加数地址→SI
MOV DI,OFFSETADD2;加数地址→DI
MOV BX,OFFSETSUM;和地址→BX
MOV CL,BYTEPTRCONT
MOV CH,0;初始化相加字长度
CLCMADDB1:MOV AX,[SI]
ADC AX,[DI] ;16位相加
INC SI
INC SI
INC DI
INC DI
MOV, [BX]AX ;相加结果送结果单元
INC BX
INC BX
LOOP MADDB1 ;执行循环
HLT
CODE ENDS
END MADDB
例2 两个未压缩的BCD数相加程序。
在8088中可以对两个用ASCII码表示的十进制数直接相加,以得到它们的和。设被加数放在SBCD1为首地址的单元中,加数放在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], ;加法运算
AAA
INC DI
MOV BYTEPTR,AL
INC BX
LOOP SBCDAD1
HLT
CODE ENDS
END SBCDAD
例3 二进制整数乘法程序。
两个二进制整数相乘,每个数的字长度放在CONT中,被乘数放在DATA1为首地址的存贮单元中,乘数放在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 二进制数转换成ASCII码程序。
编制程序,将一个字长的二进制数转换成一个ASCII码表示的字符串。二进制数放在BINNUM中,其转换结果放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码转换成二进制数的程序
将一个4位ASCII码数字转换成二进制数,ASCII码数字放在以ASCSTG为首地址的内存单元中(共有4位),转换结果放入以BIN为首地址的内存单元中。
程序如下:
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个字符,再加一个回车符共81个,程序在回车符后另加1个换行符,因此放在缓冲区内的字符实际为82个。现假设接口的接收寄存器地址为52H,
发送寄存器为53H,状态寄存器为54H,并且状态寄存器b-0=1时为发送就绪,b -1=1时为接收就绪。在接收数据时要进行偶校验,如发现有错则转错误处理。若输入
字符超过80个字符,则输出缓冲区溢出信息。
程序如下:
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