call near ptr getmax mov ah,4ch int 21h main endp
getmax proc near mov ax, [bx] mov max, ax k1: mov ax, [bx] cmp ax, max jl next mov max,ax next: add bx,2 loop k1 ret getmax endp code ends end main
6.10 某字数组,第一个单元为元素个数N,后面为N个元素,编写通用子程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。 ;delete the 0 from array data segment
array dw 6,3,4,0,1,0,5 loca dw 999 data ends code segment
assume cs:code,ds:data main proc far
mov ax, data mov ds, ax mov cx, array lea si,array lea bx, array+1 call near ptr dele0 mov ah,4ch int 21h main endp
dele0 proc near
next: cmp word ptr[bx],0 jz move add bx,2 dec cx cmp cx,0 jnz next
31
jmp exit
move: dec word ptr[si] mov di,bx mnext:
cmp di,offset loca ja next
mov ax, [di+2] mov [di],ax add di,2
cmp di,offset loca jnb next jmp mnext exit: ret dele0 endp code ends end main
6.11 从键盘输入姓名和电话号码,建立通讯录,通讯录的最大容量为9条记录,程序结束时无须保留通讯录,但程序运行时要保留通讯录信息。程序的人机界面和顺序要求如下:
(1)提示信息INPUT NAME:(调用子程序INNAME录入姓名,序号自动产生) (2)提示信息INPUT TELEPHONE NUMBER:(调用子程序INTELE录入电话号码) (3)提示信息INPUT 序号:(调用子程序PRINT显示某人的姓名和电话号码,如果序号不存在,则提示信息 NO THIS NUMB )。
;telephone number list phone struc
serial db 20h tname db 3 dup (20h) tnumb db 11 dup (20h), '$' phone ends data segment num db 0 mess1 db 13,10, 'input name(3):$' mess2 db 13,10, 'phone number(11):$' mess3 db 13,10, 'serial number(1):$' mess4 db 13,10, 'no this number!$' org 50h
plist phone 9 dup (<>) org 100h
pname db 4,?,4 dup (?) pnumb db 12,?,12 dup (?) data ends
code segment
assume cs:code, ds:data
32
main proc far push ds sub ax,ax push ax
mov ax,data mov ds,ax mov es,ax next1:
call inname call intele mov al,num dec al mov bl,16 mul bl
lea di,plist add di,ax mov dl,num add dl,30h
mov byte ptr[di],dl mov cx,3
lea si,pname+2 rep movsb mov cx,11
lea si,pnumb+2 rep movsb
cmp byte ptr num,9 jb next1 next2: call print ret main endp inname proc near lea dx,mess1 mov ah,09 int 21h ;input name(XXX) lea dx,pname mov ah,10
int 21h ;get name inc byte ptr num ret inname endp
intele proc near lea dx,mess2 mov ah,09
33
int 21h ;input phone(11) lea dx,pnumb mov ah,10
int 21h ;get phone numb ret intele endp
print proc near next3: lea dx,mess3 mov ah,09
int 21h ;input serial:(X) mov ah,1
int 21h cmp al,30h jle exit cmp al,39h jg exit sub al,30h cmp al,num jg exit pdisp: dec al mov bl,16 mul bl
lea dx,plist add dx,ax mov ah,9 int 21h jmp next3 exit: lea dx,mess4 mov ah,9 int 21h ret print endp code ends end main 6.12对十名同学的期末考试成绩进行统计,使用结构变量定义学生成绩记录并预赋值,使用子程序A统计每个学生的总分,使用子程序B显示输出每个学生的姓名和总分,对于总分应使用子程序C把总分的数值转为字符显示。
学生成绩记录格式:
字段 类型 长度 学号, 字符型, 8字节 姓名, 字符型, 3字节 数学, 数值型, 2字节 物理, 数值型, 2字节 化学, 数值型, 2字节
34
语文, 数值型, 2字节 英语, 数值型, 2字节 总分, 数值型, 2字节 备用, 字符型, 3字节
为便于显示输出,问题简化为:学生成绩只设2门课,每门课分值最高为5分 参考程序:
data segment stm struc
bname db 'aaaaaa$' c1 db ? c2 db ? c3 db 0 stm ends
st1 stm <'aaaaaa$',5,3,0> st2 stm <'bbb $',2,4,0> st3 stm <'ccc $',2,3,0> st4 stm <'ddd $',5,3,0> st5 stm <'eeeee $',2,4,0> st6 stm <'ffff $',2,4,0> st7 stm <'gg $',5,3,0> st8 stm <'hhh $',3,4,0> st9 stm <'iiii $',3,4,0> st10 stm <'kkk $',2,3,0> data ends code segment
assume cs:code,ds:data main proc far mov ax,data mov ds,ax call aa call bb mov ah,4ch int 21h main endp
aa proc near mov cx,10
mov bx,offset st1 k: mov al,[bx].c1 add al,[bx].c2 mov [bx].c3,al add bx,10 loop k ret
35
aa endp
bb proc near mov cx,10
mov bx,offset st1 j: mov dx,bx mov ah,9 int 21h mov dl,',' mov ah,2 int 21h
mov dl,[bx].c3 add dl,30h mov ah,2 int 21h add bx,10 call hh loop j ret bb endp
hh proc near mov ah,2 mov dl,13 int 21h mov ah,2 mov dl,10 int 21h ret hh endp code ends
end main 36