要求:
1. 掌握loop指令及循环程序设计方法。
2. 掌握输入/输出代码编写。
3. 学习移位指令的应用。
代码:
assume cs:codesg
codesg segment ;键盘输入8个16进制数(每个数二进制8位,即16进制2位),求出其中最大值并以16进制输出
mov cx,8h
mov bh,0 ;bh是最大值
s: mov ah,01h
mov bl,0
int 21h ;输入
cmp al,41h
jb a ;小于41H的数,即小于'A',为数字,跳转到a
sub al,7h
a: sub al,30h ;从ascll码变成数字
add bl,al ;放进bl
mov ah,01h
int 21h ;输入第二次
cmp al,41h
jb b ;小于41H的数,即小于'A',为数字,跳转到b
sub al,7h
b: sub al,30h ;从ascll码变成数字
shl bl,1 ;左移bl,腾出位置给输入位累加
shl bl,1
shl bl,1
shl bl,1
add bl,al ;放进bl
cmp bl,bh ;和bh(最大值)比较
jbe c ;bl<=bh(最大值)时转移去c
mov bh,bl ;更新bh(最大值)的值
c: loop s
mov bl,bh
mov bh,0
MOV AH,02H
MOV DL,0DH
INT 21H ;回车
MOV AH,02H
MOV DL,0AH
INT 21H ;换行
MOV CH,4 ;输出BX
ROTATE: MOV CL,4
ROL BX,CL ;把bx最高四位循环左移到最低四位
MOV AL,BL ;取出位移后的bl
AND AL,0FH ;取出al低四位,即上次bx的最高四位,这里是反向输出,先输出高位,再输出低位
ADD AL,30H ;加上30H ,开始转变为ascll码,其实这里也可以用or AL,30H,还能更快
CMP AL,3AH ;比较AL,和10的ascll码
JL PRINTIT ;JL小于转移,用于有符号数的比较,AL<3AH (为数字)则跳转
ADD AL,7H ;走到此处说明为字母,则加7变为字母的ascll
PRINTIT:MOV DL,AL ;将待输出的ascll码放入DL
MOV AH,2 ;2号功能,字符输出
INT 21H ;2号功能,字符输出,输出DL的ascll码
DEC CH ;ch --
JNZ ROTATE ;运算结果标志位 ZF!=0 则转移
mov ax,4c00h
int 21h
codesg ends
end