课设二--显示字符到屏幕

来源:互联网 发布:社交网络系统 编辑:程序博客网 时间:2024/05/21 07:51
题目:

datas段内定义的数据,在屏幕上依次按行、列显示出来,要求字符串的显示,要做成子函数


汇编代码:
assume cs:code

datas segment
 ;考号,共占用64字节
 db '42110001', '42110002', '42110003', '42110004'
 db '42110005', '42110006', '42110007', '42110008'
 ;姓名,共占24字节
 db 'qgh','eay','lfd','irc','cxg','wkf','dux','nfo'
 ;性别,共占8字节
 db 'f','f','m','f','m','m','m','f'
 ;考试分数,共占24字节
 db '267','621','467','604','344','640','306','239'
datas ends


stack segment
 db 32 dup (0)
stack ends

code segment
 start:mov ax,stack
 mov ss,ax
 mov sp,32
 mov ax,datas
 mov ds,ax
 mov ax,0b800h
 mov es,ax

 mov dh,8
 mov dl,4  ;行列
 mov bx,0
 mov cx,8

 s:
 mov si,0
 mov di,0
 call show1
 add bx,8
 inc dh
 loop s
 ;以上完成第一列显示功能

 mov dh,8
 mov dl,8  ;改变输出的显存地址
 mov bx,64
 mov cx,8

 s1:
 mov si,0
 mov di,0
 call show2
 add bx,3
 inc dh
 loop s1
 ;以上完成第二列显示功能

 mov dh,8
 mov dl,16  ;改变输出的显存地址
 mov bx,88
 mov cx,8

 s2:
 mov si,0
 mov di,0
 call show3
 add bx,1
 inc dh
 loop s2
 ;以上完成第三列显示功能


 mov dh,8
 mov dl,24  ;改变输出的显存地址
 mov bx,96
 mov cx,8

 s3:
 mov si,0
 mov di,0
 call show2
 add bx,3
 inc dh
 loop s3
 ;以上完成第四列显示功能


 mov ax,4c00h
 int 21h

 show1:push cx
 push si
 mov cx,8
 ss0:mov al,[bx+si]  ;从数据源处得到数据
 mov ah,01100000b
 push bx
 push ax
 push dx  ;行列位置的数据压栈
 call cal  ;mov bx,(dh-1)*160+(dl-1)*2得到显示处的偏移地址
 pop dx  ;行列位置数据不变的出栈
 pop ax
 mov es:[bx+di],ax  ;往显存中传送数据
 pop bx
 inc si
 add di,2
 loop ss0
 pop si
 pop cx
 ret
 ;该子函数显示8个字节的数据

 show2:push cx
 push si
 mov cx,3
 ss1:mov al,[bx+si]  ;从数据源处得到数据
 mov ah,01100000b
 push bx
 push ax
 push dx
 call cal  ;mov bx,(dh-1)*160+(dl-1)*2得到显示处的偏移地址
 pop dx
 pop ax
 mov es:[bx+di+12],ax  ;往显存中传送数据
 pop bx
 inc si
 add di,2
 loop ss1
 pop si
 pop cx
 ret
 ;该子函数显示3个字节的数据

 show3:push cx
 push si
 mov cx,1
 ss2:mov al,[bx+si]  ;从数据源处得到数据
 mov ah,01100000b
 push bx
 push ax
 push dx
 call cal  ;mov bx,(dh-1)*160+(dl-1)*2得到显示处的偏移地址
 pop dx
 pop ax
 mov es:[bx+di+12],ax  ;往显存中传送数据
 pop bx
 inc si
 add di,2
 loop ss2
 pop si
 pop cx
 ret
 ;该子函数显示1个字节的数据

 cal:mov al,2
 sub dl,1
 mul dl  ;计算列
 mov bx,ax
 mov al,160
 sub dh,1
 mul dh  ;计算行
 add bx,ax  ;相加,得到地址
 ret
 ;该子函数计算输出的显存地址
code ends

end start


补充:此答案是未经修改的,由于还有许多知识没学,目前暂不修改,因为可作为复习资料,所以不去解释过程。

**代码的相似度超过90%,是一定能够归为一个方法的,我的脑海里突然想起啦这样的话,于是,我对自己的代码进行啦修改。
assume cs:code

datas segment
 ;考号,共占用64字节
 db '42110001', '42110002', '42110003', '42110004'
 db '42110005', '42110006', '42110007', '42110008'
 ;姓名,共占24字节
 db 'qgh','eay','lfd','irc','cxg','wkf','dux','nfo'
 ;性别,共占8字节
 db 'f','f','m','f','m','m','m','f'
 ;考试分数,共占24字节
 db '267','621','467','604','344','640','306','239'
datas ends


stack segment
 db 32 dup (0)
stack ends

code segment
 start:mov ax,stack
 mov ss,ax
 mov sp,32
 mov ax,datas
 mov ds,ax
 mov ax,0b800h
 mov es,ax

 mov dh,8
 mov dl,4  ;行列
 mov bx,0
 mov cx,8

 s:
 mov si,0
 mov di,0
 mov ax,8  ;ax为传入子函数的参数,表示打印出的字符串有几个字符
 call show
 add bx,8
 inc dh
 loop s
 ;以上完成第一列显示功能

 mov dh,8
 mov dl,15  ;改变输出的显存地址
 mov bx,64
 mov cx,8

 s1:
 mov si,0
 mov di,0
 mov ax,3
 call show
 add bx,3
 inc dh
 loop s1
 ;以上完成第二列显示功能

 mov dh,8
 mov dl,21  ;改变输出的显存地址
 mov bx,88
 mov cx,8

 s2:
 mov si,0
 mov di,0
 mov ax,1
 call show
 add bx,1
 inc dh
 loop s2
 ;以上完成第三列显示功能


 mov dh,8
 mov dl,25  ;改变输出的显存地址
 mov bx,96
 mov cx,8

 s3:
 mov si,0
 mov di,0
 mov ax,3
 call show
 add bx,3
 inc dh
 loop s3
 ;以上完成第四列显示功能

 mov ax,4c00h
 int 21h

 show:push cx
 push si
 mov cx,ax  ;传入参数
 ss0:mov al,[bx+si]  ;从数据源处得到数据
 mov ah,01100000b
 push bx
 push ax
 push dx  ;行列位置的数据压栈
 call cal  ;mov bx,(dh-1)*160+(dl-1)*2得到显示处的偏移地址
 pop dx  ;行列位置数据不变的出栈
 pop ax
 mov es:[bx+di],ax  ;往显存中传送数据
 pop bx
 inc si
 add di,2
 loop ss0
 pop si
 pop cx
 ret
 ;该子函数显示字符串

 cal:mov al,2
 sub dl,1
 mul dl  ;计算列
 mov bx,ax
 mov al,160
 sub dh,1
 mul dh  ;计算行
 add bx,ax  ;相加,得到地址
 ret
 ;该子函数计算输出的显存地址
code ends

end start

补充:同样期待下一次的灵光一闪,当然这是基于知识面够充足的情况下。
0 0