题目:
将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
;考号,共占用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
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
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 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
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 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
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 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 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个字节的数据
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个字节的数据
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个字节的数据
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
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
;考号,共占用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
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
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 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
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 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
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 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 si,0
mov di,0
mov ax,3
call show
add bx,3
inc dh
loop s3
;以上完成第四列显示功能
mov ax,4c00h
int 21h
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
;该子函数显示字符串
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
sub dl,1
mul dl ;计算列
mov bx,ax
mov al,160
sub dh,1
mul dh ;计算行
add bx,ax ;相加,得到地址
ret
;该子函数计算输出的显存地址
code ends
end start
补充:同样期待下一次的灵光一闪,当然这是基于知识面够充足的情况下。