任务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
时间: 2024-01-16 11:03:49 浏览: 100
c代码-从键盘任意输入五个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名。
这段程序是一个简单的汇编程序,可以实现根据输入的学生序号,在屏幕最上面一行输出对应学生的姓名。
下面是代码注释和解释:
```
assume cs:code, ds:data
data segment
stu dw stu1,stu2,stu3,stu4,stu5 ; 定义一个包含五个学生姓名的字指针数组
stu1 db 'Zhang San',0 ; 定义五个学生姓名,每个姓名以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 ; 调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码
int 21h
sub al, 30h ; 将读入的字符的ASCII码转换成数字
cmp al, 0 ; 判断是否为0,如果为0则退出程序
je exit
cmp al, 5 ; 判断输入的数字是否大于5,如果大于5则不做任何响应
ja input
; 下面是输出对应学生姓名的代码
mov bx, [stu + al * 2] ; 将对应学生姓名的字指针读入BX寄存器
mov si, bx ; 将BX寄存器中的地址赋值给SI寄存器,用于遍历字符串
mov di, 0 ; 初始化DI寄存器,用于显存偏移
output:
mov al, [si] ; 将学生姓名中的字符读入AL寄存器
mov ah, 0Ch ; AH寄存器的高4位为字符的显示属性,此处为0C表示白底红字
mov es:[di], ax ; 将字符和显示属性写入显存
inc di ; DI寄存器加1,指向下一个字符
cmp al, 0 ; 判断是否到达字符串结尾
je exit_output ; 如果是则退出
inc si ; SI寄存器加1,指向下一个字符
jmp output ; 继续输出字符
exit_output:
jmp input
exit:
mov ah,4ch
int 21h
code ends
```
在这段程序中,首先定义了一个包含五个学生姓名的字指针数组,每个学生姓名以0结尾。然后在程序中使用一个循环来读入输入的字符并将其转换成数字。然后通过比较输入的数字和5的大小,来判断是否需要输出学生姓名。如果需要输出,则通过字指针数组和偏移量来定位到对应学生姓名的首地址,并遍历字符串输出每个字符。最后,程序通过调用21h中断的第4Ch号功能来退出程序。
阅读全文