例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