; 子程序名: Hex2DecStr
; 功能描述: 十六位二进制数转换成十进制数的ASCII串 ; 入口参数1: AX中存放待转换的十六位二进制数
; 入口参数2: DS:SI=接收转换后的ASCII串的开始地址 ; 出口参数: DS:SI=转换结果所在存储单元的开始地址 Hex2DecStr PROC PUSH BX ; 保护用到的寄存器 PUSH DX ① ; 除数10 ADD SI, 5 ; 16位2进制转换后最多5位 L1: SUB DX, DX ; DX:AX/BX =>0:AX/BX DIV BX ; 用10除==>余数(DX), 商(AX) OR DL, ② ; 非压缩BCD==>ASCII DEC SI ; 修改指针,指向前一个字符 MOV [SI], ③ ; 保存结果 CMP AX, 0 ; 当商≠0时继续循环 ④ POP DX ; 恢复用过的寄存器内容 POP BX ⑤ ;返回 Hex2DecStr ENDP
3、一个查询式输出接口电路图如下,状态端口(3FBH)的D5位为状态标志,写入数据端口(3F8H)会使状态标志置1,外设把数据读走后又把它置0。下面的程序段是通过该接口向外设输出DATA中的100个字节的数据,请完善划线处的代码。
4、某系统利用8253控制发光二极管亮灭时间,欲使LED以亮1s,灭1s的间隔工作,设该8253的地址范围为300H~303H,电路链接图如下。请完善下面程序段中划线处的代码,使其完成该8253的初始化工作。
A卷 共(16) 页 第 (11) 页
;计数器1初始化
MOV DX, ①
MOV AL, 01110101B ;计数器1方式2,BCD OUT DX, AL ;命令字写入
MOV DX, ② ;DX指向计数器1 MOV AL, 00H ;计数初值低字节 OUT DX, AL
MOV AL, 10H ;计数初值高字节 OUT DX, AL ;计数初值为1000 ;计数器2初始化 MOV DX, 303H
MOV AL, 10110111B ;计数器2方式3,BCD OUT DX, ③ MOV DX, 302H
MOV AL, ④ ;计数初值低字节 OUT DX, AL
MOV AL, ⑤ ;计数初值高字节 OUT DX, AL ;计数初值为2000 5、已知两台PC/XT计算机的串行口COM1已连接好,要求从机用查询方式接收主机发来的字符,每次接收到字符后,直接送显示器,已知状态口为3FDH,数据口为3F8H.请完善从机接收的处理程序。
REV: MOV DX, ① IN AL, ②
TEST AL,01H ;测试有无字符可接收
JZ REV ;无字符,继续查询状态口 MOV DX, ③ ;有字符,把数据口地址送DX IN AL,DX
MOV DL, ④ ;显示字符 MOV AH, ⑤ INT 2lH JMP REV
A卷 共(16) 页 第 (12) 页
6、如下图所示,ADC0809通过8255A与CPU相连。已知8255A的A口地址为300H;B口地址为301H;C口地址为302H;控制口地址303H.以下程序用查询方式读取A/D转换结果。请完善这个程序。
;初始化8255A,A口方式0,输入;B口方式0,输出;PC4~PC7输入; START: MOV AL,98H ;8255A方式控制字 MOV DX, ① OUT DX,AL
MOV AL,0BH ;选定ADC0809的IN3(通道3) MOV DX,301H OUT DX, ②
MOV AL,10H ;启动ADC0809进行A/D转换 OUT DX,AL NOP NOP
MOV ③ , 00H ;启动脉冲的下降沿 OUT DX, AL MOV DX, 302H
REPT: IN AL, ④ ;查询EOC
AND AL, 10H ;EOC为低,A/D未结束,再查询 JZ REPT
MOV DX, ⑤ ;EOC变高,A/D结束,读入转换结果 IN AL, DX
INT 3 ;程序停止
7、设有10个字节属性的无符号数据存放在以2000H单元为首地址的数据缓冲区中,下面程序的功能是找出其中的最大数,并存入2100H单元;请完善这个程序。
…
MOV BX, ① MOV AL, [BX] MOV CX,9
A卷 共(16) 页 第 (13) 页
LAB: INC ② CMP AL,[BX] JAE LABLE MOV AL, ③ LABLE: DEC ④ JNZ LAB MOV BX, ⑤ MOV [BX], AL …
8、下面程序的功能是比较两个相同长度的字符串。两个字符串存放在数据段中,长度均为20,首地址分别为STR1和STR2。如果两个字符串不同,找出其中第一个不相等字符的序号(1--20)送AX;如果这两个字符串全部相同,则AX=0。请完善这个程序。
MOV AX, DS
MOV ES, ①
LEA SI, ②
LEA ③ ,STR2 MOV CX, 20 CLD
MOV AX, 0 REPE ④ JZ ⑤ MOV AX, 20 SUB AX, CX ALLMATCH: RET
9、在包含100个字符的字符串中寻找第一个回车符CR(其ASCII码为0DH),找到后将其地址保留在ES:DI中,并在屏幕中显示“Y”;如果没有找到,则在屏幕上显示“N”。该字符串的首地址为STRING。请完善这个程序。 MOV AX, SEG STRING MOV ① , AX MOV DI,OFFSET ② MOV AL,0DH MOV CX, ③ CLD MOV DL,?N? REPNE ④ JNZ NOTFOUND DEC DI MOV DL,?Y?
NOTFOUND: MOV AH,2
INT ⑤ 10、下面程序的功能是将BX寄存器的内容以二进制数格式显示在屏幕上,请完善这个程序。 CODE SEGMENT
ASSUME CS:CODE BEG: MOV BX,5678H MOV CX, ①
A卷 共(16) 页 第 (14) 页
LAST: MOV DL,'0 '
ROL BX,1 ADC DL,0 MOV AH, ② INT ③ LOOP LAST
MOV AH,4CH INT 21H CODE ④ END ⑤ 11、设x、y、z均为32位数,分别存放在地址为X, Y, Z的存储单元中,下面程序段的功能是计算x+y+24-z,结果放在W单元中;请完善这个程序。
MOV AX, X ; x的低16位
MOV DX, X+2 ; x的高16位 ADD AX, Y ① DX, Y+2 ; x+y ADD AX, 24 ADC ② , 0 ; x+y+24 SUB AX, Z SBB DX, ③ ; x+y+24-z MOV W, ④ MOV W+2, ⑤ ; 结果存入W, W+2单元
12、从buff开始的内存中,有100个带符号的16位数,希望找出其中的最大值,并将它放到MAX单元中。请完善下面程序以实现改功能。 LEA BX,BUFF ;地址=>BX MOV AX,[BX] ;取第一个数据 INC BX ;地址+2,指向下一个数 INC BX
MOV ① ,99
AGAIN:CMP AX,[BX] ;比较 ② NEXT ;AX>[BX]?
MOV AX, ③ ;大数送AX
NEXT: INC BX ;指向下一个要比较的数 INC BX ④ CX
JNZ AGAIN ;所有的数比较完了吗?
MOV MAX, ⑤ ;保存结果
13、要求对一组2位压缩BCD码求和,结果保存在sum中(4位压缩BCD码)。程序代码如下,请完善该程序。
mydata ① ;定义数据段
bcdData DB 23h, 31h, 38h, 18h, 43h, 48h, 26h, 32h DB 48h, 26h, 32h, 64h, 56h, 64h, 21h nums EQU $-bcdData sum DW ? mydata ENDS code SEGMENT
A卷 共(16) 页 第 (15) 页
ASSUME cs:code, ds:mydata, es:mydata start: MOV AX, mydata MOV DS, ② MOV CX, nums SUB AX, AX ;AX <== 0 LEA SI, bcdData ;取数据块的地址 again: ADD AL, [SI] ;累加求和 ③ ;十进制调整 ADC AH, 0 ;如果有进位,加到AH中 XCHG AL, AH DAA ;对AH中的数据进行BCD码调整 XCHG AL, AH INC SI LOOP again MOV sum, ④ ;保存结果 MOV AH, 4CH ;退出程序 INT 21H code ⑤ ;code段定义结束 END start
A卷 共(16) 页 第 (16) 页