本想写上来的,无奈是个综合题,用好了多之前的代码
真是……
故事还得从这说起
这是一个记录公司信息的程序,分别将年份,总收入,人数,人均收入存入 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
这些子程序我都能写出来,但就是弄不到一块完成任务
应该是我写的代码太僵了,不能很好的移植利用,请大神看看,子程序要怎么写,才能最好的利用它