1. 字符串字典序比较
如下所示的数据区中给出两个字符串,请比较它们的大小,并将结果记录在result处:相等(E)、前大后小(A)、前小后大(B)
data segment
str1 db 'Yan Tai',0
str2 db 'Yan Tai',0
result db 0
data ends
请在程序中加入足量的注释
assume cs:code, ds:data
data segment
str1 db 'Yan Tai',0
str2 db 'Yan Cheng',0
result db 0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,offset str1 ;指向前一个字符串
mov di,offset str2 ;指向后一个字符串
range:
mov al,[si] ;顺序取str1的字符
mov ah,[di] ;顺序取str2的字符
cmp al,0
je final
cmp ah,0
je final ;以上4句判断两个字符串是否有一个到达末尾
cmp al,ah ;两个字符串都没到末尾,比较大小
je r ;相等则继续比较
jmp final
r:
inc si ;指向str1的下一个字符
inc di ;指向str2的下一个字符
jmp range
final: ;最后一次判断
je e
ja a
mov byte ptr [result],'B';前小后大
jmp stop
e:
mov byte ptr [result],'E';相等,即都是末尾的0
jmp stop
a:
mov byte ptr [result],'A';前大后小
stop:
mov ax, 4c00h
int 21h
code ends
end start
2. 最小字符
在数据区中给出10位评委为歌手的打分,最高分为10分,最低分为0分。
歌手的最终成绩为去掉一个最高分和一个最低分后的平均值(整数部分),请计算并将成绩记录在result处。
data segment
singer db 8, 8, 8, 6, 10, 6, 6, 7, 7, 6
result db 0
data ends
请在程序中加入足量的注释
assume cs:code, ds:data
data segment
singer db 8,8,8,6,10,6,6,7,7,6
result db 0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov cx,10
mov si,offset singer
mov ax,0 ;al总分
mov bh,[si] ;最高分
mov bl,bh ;最低分
range:
mov ah,[si] ;ah取数
add al,ah ;al加总分
cmp ah,bh ;比较
jbe r
mov bh,ah ;更新最高分
r:
cmp ah,bl ;比较
jae rr
mov bl,ah ;更新最低分
rr:
inc si ;指向下一个数
loop range ;继续循环
mov ah,0 ;处理被除数
sub al,bl ;减去最底分
sub al,bh ;减去最高分
mov dl,8
div dl ;求平均
mov [result],al ;保存整数商
mov ax,4c00h
int 21h
code ends
end start
3. 输出学生姓名
给出下的程序段,其中数据区存放了若干学生的姓名,请输入学生序号,在屏幕最上面一行输出对应学生的姓名。
assume cs:code, ds:data
data segment
stu dw stu1,stu2,stu3,stu4,stu5
stu1 db 'Zhang San',0
stu2 db 'Li Si',0
stu3 db 'Wang Wu',0
stu4 db 'Zhao Liu',0
stu5 db 'Qian Er',0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
input:
mov ah,1
int 21h ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码
sub al, 30h ;相减后,al中保存的ASCII变为数字
;为0时退出,为1-5时在屏幕最上面一行输出对应人的姓名,输入其他无响应
;请在程序中加入足量的注释
mov ah,4ch
int 21h
code ends
end start
Answer:
assume cs:code, ds:data
data segment
stu dw 0,stu1,stu2,stu3,stu4,stu5 ;直接定址表
stu1 db 'Zhang San',0
stu2 db 'Li Si',0
stu3 db 'Wang Wu',0
stu4 db 'Zhao Liu',0
stu5 db 'Qian Er',0
data ends
stack segment stack
db 16 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h ;显存区域从B800:0000开始,往后4000个字节,共25*80=2000个显示位
mov es,ax ;每个位置占两个字节,有低字节ASCII码和高字节属性值
input:
mov ah,01h ;DOS系统功能调用(21H类型中断调用)
int 21h ;调用21h中断的第1号功能,单字符输入,功能号AH=01H,类型号21H
;出口参数:AL=键入字符的ASCII码
sub al,30h ;减字符'0',相减后,AL中保存的ASCII变为数字
;为0时退出,为1-5时在屏幕最上面一行输出对应人的姓名,输入其他无响应
call clear ;先把第一行清空
cmp al,0
je exit ;0退出
cmp al,1 ;不在1~5之间继续输入
jb input
cmp al,5
ja input
mov bh,0
mov bl,al
add bx,bx ;定址表为dw,乘2
mov si,stu[bx] ;源字符串
mov di,0 ;目标字符串
c: mov ch,0
mov cl,ds:[si]
jcxz input
inc si
mov ch,2h;字符属性值
mov es:[di],cx
add di,2
loop c
clear: ;清空第一行
mov cx,80 ;第一行80个位置
mov di,0 ;第一行的偏移地址
mov dx,0220h;背景色黑色,空格
cle:
mov es:[di],dx
add di,2
loop cle
ret
exit:
mov ah,4ch
int 21h
code ends
end start