本想写上来的,无奈是个综合题,用好了多之前的代码
真是……
故事还得从这说起
这是一个记录公司信息的程序,分别将年份,总收入,人数,人均收入存入 table 段中
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ') ; ?? 是存放要算出的人均收入
table ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov ss,ax
mov si,0
mov bx,0
mov cx,21
s:
mov ax,[bx]
mov [bp],ax
mov ax,[bx+2]
mov [bp+2],ax
;存年份
mov ax,[bx].54h
mov [bp].5,ax
mov ax,[bx].56h
mov [bp].7,ax
;存总收入
mov ax,0a8h[si]
mov [bp].10,ax
;存人数
mov dx,[bx].56h
mov ax,[bx].54h
div word ptr 0a8h[si]
mov [bp].13,ax
;存人均收入
add bx,4h
add bp,10h
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
然后这个两个代码合并后的程序,功能是输入一个十进制数,以及行数,列数,颜色(颜色有对应的二进制数),然后将输入的数据存入彩色显存中,最后把该十进制显示在屏幕上
assume cs:code,ds:data,ss:stack
data segment
db 0
data ends
stack segment
db 0
stack ends
code segment
start: mov ax,35487 ;interface,number
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,10h
mov si,0
call dtoc
mov dh,12 ;interface,row
mov dl,40 ;interface,column
mov cl,10 ;interface,color
mov si,0
call showtr
mov ax,4c00h
int 21h
dtoc: mov dx,0
mov bx,10 ;用除法得到每一位上的数
div bx
add dx,30h ;十六进制数的ascll码 + 30h 得到十进制数的ascll码
push dx
mov cx,ax
inc si
jcxz go
jmp short dtoc
go: mov cx,si
mov si,0
jmp short fi
fi: pop dx
mov [si],dl
inc si
loop fi
ret
showtr: mov ch,0
mov ss:[0],cl
mov cl,dh ;
mov ax,0 ;
s: add ax,0a0h ; 算出行偏移地址,放入bx
loop s ;
mov bx,ax ;
mov ax,0b800h;
mov es,ax ; es存放显存段地址
mov cl,dl ;
mov ax,0 ;
s0: add ax,2 ; 算出列偏移地址,放入di
loop s0 ;
mov di,ax ;
s1: mov ch,0
mov cl,[si]
jcxz ok
mov es:[bx+di],cl
mov al,ss:[0]
mov es:[bx+1+di],al
add di,2
inc si
jmp short s1
ok: ret
code ends
end start
现在任务的要求是,用之前学过的东西(我理解为之前写过的代码,因为实在不想重写),把公司的信息按
1975 16 3 5
1976 22 7 3
……
1995 5937000 17800 333
显示在屏幕上
很烦,不知道怎么把这些代码整合起来,主要有这些困难
年份的存入是 '1975' ,存入内存后是十进制对应的 ascll 码,而之后的数据存入内存后值十六进制对应的 ascll 码
这就要在dtoc中用不同的方式处理(我没改年份定义为 db 1975 ,把这个也当成练习了)
还有总收入中有数据大于 2^16 ,所以在dtoc中会出现除法溢出
解决的代码如下
assume cs:codesg
stack segment
dw 0
stack ends
codesg segment
start: mov ax,stack
mov ss,ax
mov sp,10h
mov ax,9768h ;interface,low_number
mov dx,5ah ;interface,high_number
mov cx,10 ;interface,div_number
call divdw
mov ax,4c00h
int 21h
divdw: mov ss:[0],ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,ss:[0]
div cx
mov cx,dx
pop dx
ret ;结果,dx放高16位,ax放低16位
;cx放余数
codesg ends
end start
这些子程序我都能写出来,但就是弄不到一块完成任务
应该是我写的代码太僵了,不能很好的移植利用,请大神看看,子程序要怎么写,才能最好的利用它