汇编语言程序设计 148
push dx ;把每次除以10的余数压入堆栈,并记录数据位个数 inc pushcount cmp ax,0 jne loop1
print: pop dx ;从堆栈弹出每位数据并显示 add dx,30h mov ah,2 int 21h
dec pushcount jnz print
mov ah,2 ;显示完一个数据的各个数位后再显示空格进行分隔 mov dl,' ' int 21h pop dx pop bx ret bintodec endp END
2、汇编并链接通过该程序,观察执行结果;
3、试着把被排序的数据类型改为字节数据,程序该怎么修改? 4、如果要把数据按16进制显示,该怎么修改程序?
汇编语言程序设计实验指导 149
实验八 结构的应用及宏程序设计
实验目的
1、掌握结构的定义与使用方法;
2、掌握宏定义及其调用和展开的具体过程; 3、掌握宏的参数和局部标号的使用方法;
4、掌握高级程序流程控制语句中判断是否相等的双等号应用;
实验内容
定义一个保存学生成绩单的结构,并且计算总分,最后按照总分的从高到低顺序显示成绩单,要求名次和成绩及总分都按照10进制显示输出。
实验步骤
1、输入下列程序,汇编并链接通过。
.model small .stack .data
student struct ;结构定义
snumber dw 0 ;编号,代表名次 sid db 15 dup('$') ;学号
sname db 20 dup('$') ;最多20位,姓名 score1 dw 0 ;成绩1 score2 dw 0 ;成绩2 score3 dw 0 ;成绩3 ttscore dw 0 ;总分 student ends
scoresheet student <1,'computer01$','zhangsan$',90,70,60,> student <2,'computer02$','lisi $',100,0,100,> student <3,'computer03$','wanger $',95,66,88,> student <4,'computer04$','zhuwu $',120,90,99,> student <5,'computer05$','john $',90,80,95,> ;成绩单长度可以任意,这里只列举5个纪录
sheetlength=($-scoresheet)/(type scoresheet) ;成绩单长度,即纪录条数 pushcount db 0 ;临时存放被显示数据的位数 .code
汇编语言程序设计 150
nextline macro ;显示换行的宏定义 mov ah,2 mov dl,10 int 21h mov ah,2 mov dl,13 int 21h endm
dispone macro one ;显示一个字符的有参数宏定义 mov ah,2 mov dl,one int 21h endm
dispscore macro ;按照10进制显示内存单元数据的宏定义 local loop1,print ;局部标号定义 push bx push dx mov bl,10 loop1: div bl mov dl,ah mov ah,0
push dx ;把每次除以10的余数压入堆栈,并记录数据位个数 inc pushcount cmp al,0 jne loop1
print: pop dx ;从堆栈弹出每位数据并显示 add dl,30h dispone dl dec pushcount jnz print
dispone 20h ;显示一个空格 pop dx pop bx endm
.startup
lea bx, scoresheet mov cx,sheetlength
.repeat ;统计每条记录的总分 mov ax,[bx].student.score1
汇编语言程序设计实验指导 151
add ax,[bx].student.score2 add ax,[bx].student.score3 mov [bx].student.ttscore,ax
mov [bx].student.snumber, 0 ;名次初始化为0 add bx, type scoresheet .untilcxz
mov dx,0 ;DX控制总循环次数,初始值为0 push dx begin:
lea bx, scoresheet mov cx, sheetlength .repeat
.if [bx].student.snumber==0 ;找到第一个未排名的纪录 mov ax,[bx].student.ttscore ;总分记录在AX中 .break .else
add bx, type scoresheet .endif .untilcxz
mov bx,offset scoresheet mov cx,sheetlength .repeat
.if [bx].student.snumber==0
.if [bx].student.ttscore>=ax ;逐一比较找到一个未排序的且总分最高的纪录 mov ax,[bx].student.ttscore;AX保存最高的总分
mov di,bx ;有最高总分的记录地址保存在DI寄存器中 .endif .endif
add bx, type scoresheet .untilcxz
nextline ;在新的一行显示每条记录信息 mov bx,di pop dx inc dx push dx
mov [bx].student.snumber,dx ;DX加1为当前名次 mov ax,dx ;显示名次

