微机原理习题4-汇编语言程序设计 下载本文

AND AH, 01H ;将最高位的进位标志送AH OR AH, 30H ;最高位的进位位拼成ASCII码 MOV [DI], AH ;存结果的最高位 MOV AH, 02H ;调用DOS的02H功能显示 MOV CX, 05H ;显示数据的位数

DON2: MOV DL,[DI] ;显示数据送DL

INT 21H ;显示 DEC DI ;显示数据所在存储单元加一 LOOP DON2 ;未显示完,继续 MOV AH, 4CH ;返回DOS INT 21H

RET

MAIN ENDP CODE ENDS

END START

4.11 试编程序,统计由40000H开始的16K个单元中所存放的字符“A“的个数,并将结果存放在DX中。

【答】 参考程序

DATA SEGMENT

BUF DB 'DFASFAAAFDFAAFFFA' COUNT EQU $-BUF DATA ENDS STACK SEGMENT

BUFF DW 100 DUP (?) M EQU $- STA STACK ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: MOV AX,DATA

MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,M MOV SP,AX MOV CX,COUNT MOV DX,0 LEA SI,BUF MOV AL,'A' CALL FindChar MOV AH,4CH

INT 21H ;返回 DOS

FindChar PROC NEAR PUSH DX

NEXT : CMP [SI],AL

JNZ OTHER INC DX

OTHER: INC SI

LOOP NEXT POP DX RET

FindChar ENDP CODE ENDS

END BEGIN

4.12 统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。 【答】解法一:采用串操作指令,要程序片段:

BLOCK DB -1,-3,5,6,-2,0,20,10 PLUS_D DB 8 DUP(?) ;正数缓冲区 MINUS_D DB 8 DUP(?) ;负数缓冲区

PLUS DB 0 MINUS DB 0 MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS_D MOV BX,OFFSET MINUS_D MOV CX, 8 ;数据个数送CX GOON: LODSB ;AL← [SI] TEST AX, 80H JNZ JMIUS ;为负数,转 INC PLUS ;正数个数加一 STOSB ;[DI] ←AL,传正数 JMP AGAIN JMIUS: INC MINUS ;负数个数加一 XCHG BX, DI STOSB ;送负数到缓冲区 XCHG BX, DI AGAIN: DEC CX JNZ GOON

解法二:用比较指令CMP、转移指令JA/JNA/JB/JNB、循环指令LOOP等 BLOCK DB -1,-3,5,6,-2,0,20,10 N EQU $-BLOCK PLUS_D DB 8 DUP(?) ;正数缓冲区 PLUS DB 0

MINUS_D DB 8 DUP(?) ;负数缓冲区 MINUS DB 0 ……

MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS_D MOV BX,OFFSET MINUS_D MOV CX, N ;数据个数送CX GOON: MOV AL,[SI] TEST AL, 80H JNZ JMIUS ;为负数,转 INC PLUS ;正数个数加一 MOV [DI],AL ;传正数 INC DI

JMP AGAIN JMIUS: INC MINUS ;负数个数加一 MOV [BX],AL INC BX AGAIN: INC SI DEC CX JNZ GOON

4.13 编写一个子程序将AX中的十六进制数,转换成ASCII码, 存于ADR开始的四个单元中。

提示:1)、AX中的数从左到右,转换成ASCII码,用循环左移ROL和AND指令,把提出的一个十六进制数置BL中;

2)、0 ~ 9 的ASCII码:30 ~ 39H,A ~ F 的ASCII码:41H ~ 46H。 ( 先把每个数加30H,判断是否为数字0 ~ 9?若是A ~ F,再加07H,得字母的ASCII码。) 【答】 参考程序: DATA SEGMENT

ADR DB 5 DUP(?) DATA ENDS

CODE SEGMENT MAIN PROC FAR

ASSUME CS:CODE,DS:DATA START: MOV AX,7EC3H ;假设ax中存放7ec3h

LEA SI,ADR MOV DL,4

AGAIN:

MOV AND ADD CMP JG JMP ADD MOV INC MOV ROL DEC JNZ

BX,AX BX,000FH BL,30H BL,'9' ADUST STORE BL ,07H [SI],BL SI CL,4 AX,CL DL AGAIN

ADUST: STORE:

MAIN ENDP CODE ENDS

END START

4.14 编写一个子程序将AX中的2进制数,转换成10进制ASCII码, 存于ADR开始的五个单元中。

【答】算法分析:

(1)一个16位2进制数,其值最大为65535。采用除10取余数方法,即可得到各个位。

A)十进制数a5a4a3a2a1,除以10,余数a1为个位;商a5a4a3a2 B)a5a4a3a2再除以10,余数a2为十位; C)以此类推,得到百位、千位、万位。

(2)再将其加上30H则得到ASCII码,以便输出显示。

(3)若数据为负数,用0减去该数,可得绝对值,再将符号位记录下来即可。 参考程序:

DATA SEGMENT

BIN DW -1988 ;带符号二进制数

ADR DB 6 DUP(0),'$' ;十进制数以ASCII码存储

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

TRAN PROC FAR

MOV AX,DATA MOV DS,AX MOV AX,BIN LEA DI,ADR

CALL BINASCII ;十六位二进制数转换为十进制ascii码 MOV AH,4CH INT 21H ;返回DOS

TRAN ENDP

;子程序BINASCII功能:将16位二进制数转换为ASCII码,存于ADR开始的连续6个单元,并显示

;入口参数:AX=待转换的数, 预定义一个缓存区ADR,7个字节,最末字节为‘$’字符。 ;出口参数:DI=转换好的ASCII码首地址,显示该十进制数据 BINASCII PROC

PUSH BX PUSH CX PUSH DX TEST AX,8000H ;判断数据的符号 JNS PLUS

MINUS: MOV BYTE PTR[DI],'-' ;将符号存储

NEG AX ;如是负数,取相反数去掉符号位 JMP GO

PLUS: MOV BYTE PTR[DI],'+' ;将符号码存储 GO: ADD DI,5 ;DI指向个位

MOV CX,5

MOV BX,10

LP: MOV DX,0

DIV BX ;算法为a/10 ,余数为一个低位十进制数 ADD DL,30H ;转换为ASCII码 MOV BYTE PTR[DI],DL ;从个位开始存储 DEC DI LOOP LP MOV DX,DI MOV AH,09H INT 21H ;显示 POP DX POP CX POP BX RET

BINASCII ENDP CODE ENDS

END TRAN

4.15 编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。 【答】参考程序:

JIAOYAN PROC FAR

MOV AL,1001110B OR AL, AL JNP NEXT MOV AL,0 JMP DONE

NEXT: MOV AL,1

DONE: MOV AH,04CH

INT 21H

JIAOYAN ENDP

4.16 从2000H单元开始的区域,存放100个字节的字符串,其中有几个$符号(ASCII 码为24),找出第一个$符号,送AL中,地址送BX。 【答】参考程序:

SEARCH PROC FAR

MOV DI,2000H MOV CX,100 MOV AL,24H CLD

REPNZ SCASB JNZ STOP DEC DI MOV BX,DI MOV AL,[DI]

STOP: RET SEARCH ENDP

4.17 用串操作指令实现:先将100H个数从2170H单元处搬到1000H单元处,然后从中检索等于AL中字符的单元,并将此单元换成空格字符。 【答】参考程序:

MOV AL,24H MOV SI,2170H MOV DI,1000H MOV CX,100H CLD

DO: REP MOVSB

MOV DI,1000H MOV CX,100H CLD

REPNZ SCASB DEC DI