assume cs:code
data segment
;年份
db '1975','1976','1977','1978','1979','1980','1981'
db '1982','1983','1984','1985','1986','1987','1988'
db '1989','1990','1991','1992','1993','1994','1995'
;营业额
dd 16,22,382,356,2390,8000,16000
dd 24486,50065,97479,140417,197514,345980,590827
dd 803530,1183000,1843000,2759000,3753000,4649000,5937000
;员工数
dw 3,7,9,13,28,38,130
dw 220,476,778,1001,1442,2258,2793
dw 4037,5635,8226,11542,14430,15257,17800
data ends
outstr segment
;年(3) 收入(12) 人数(23) 人均(31)
db 16 dup (0)
outstr ends
code segment
start: mov ax,data
mov es,ax
mov ax,outstr
mov ds,ax
mov si,0
mov bl,0
mov bh,2
mov di,0
mov cx,21
outlp: mov al,4
mul bl
mov di,ax
mov ax,es:[di]
mov ds:[0],ax
mov ax,es:[di+2]
mov ds:[2],ax
mov byte ptr ds:[4],0
;定位列
mov dh,bh
mov dl,3+10
mov ax,cx
mov cl,2
;显示
call show_str
mov cx,ax
mov ax,es:[di+84]
mov dx,es:[di+84+2]
call ddtoc
;定位列
mov dh,bh
mov dl,12+10
mov ax,cx
mov cl,2
;显示
call show_str
mov cx,ax
push di
mov al,2
mul bl
mov di,ax
mov ax,es:[di+168]
mov dx,0
call ddtoc
;定位列
mov dh,bh
mov dl,23+10
mov ax,cx
mov cl,2
;显示
call show_str
mov cx,ax
mov si,di
pop di
mov ax,es:[di+84]
mov dx,es:[di+84+2]
mov di,si
div word ptr es:[di+168]
mov dx,0
mov si,0
call ddtoc
;定位列
mov dh,bh
mov dl,31+10
mov ax,cx
mov cl,2
;显示
call show_str
mov cx,ax
inc bl
inc bh
dec cx
jcxz th_over
jmp near ptr outlp
th_over:mov ax,4c00h
int 21h
;名称: ddtoc
;功能: 将dword型数据转变为表示十进制数的字符串,字符串以0为结束符.
;参数: (ax)低16位,(dx)高16位; ds:si指向字符串的首地址
;返回: 无
ddtoc: push ax
push bx
push cx
push dx
push si
;压栈
mov bx,0
t_st: mov cx,10
call divdw
push cx
inc bx
mov cx,dx
jcxz cklow ;如果高位为0,则转去判断低位
jmp short t_st
cklow: mov cx,ax
jcxz mk_str ;判断低位
jmp short t_st
mk_str: mov cx,bx
mks1: pop ax
add ax,30h
mov [si],ax
inc si
loop mks1
mov byte ptr [si],0
;出栈
pop si
pop dx
pop cx
pop bx
pop ax
ret
;名称: divdw
;功能: 进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数: (ax)=dword型数据的低16位;(dx)=dword型数据的高16位;(cx)=除数
;返回: (dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
divdw: push bx
;压栈
;X/N=int(H/N)*65536 + [rem(H/N)*65536+L]/N
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
;出栈
pop bx
ret
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围),(cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:push ax
push bx
push cx
push ds
push es
push si
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;算出要显示的起始位置
mov ax,0b800h
mov es,ax ;设置显存位置
mov ah,cl ;设置颜色
show1: mov ch,0
mov cl,ds:[si]
jcxz over_l
mov al,cl
mov es:[bx],ax
inc si
add bx,2
jmp show1
over_l: pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
- [ltp1234] 顶起 04/18 23:05
- [chinatree] 不错,顶,最好有张图。 09/09 22:05
- [tomato] 哦。原来如此。 09/08 19:44
- [tomato] 支持你!加油!光说可不行!看你以后的行动了!希望你能够坚持下来。将书中的检测点实验一个不落地完成!这 09/08 19:44
- [chinatree] 话是那么说,随你了。 09/08 14:42
- [landyking] 我用的是第二版,书上写的是大写的A,并且书里面有提到哪里记录着大小写开关和shift的状态,所以我觉 09/08 14:24
- [chinatree] 可是书上并没有要求必须是大写才显示,说是只要松开a键就显示满屏的a。 09/08 13:42
- [chinatree] 一起加油吧,起码你的起点比我高,我只是初中毕业。 09/08 12:13
- [landyking] @chinatree: 呃.不太懂你的意思. 大小写扫描码是相同的,对啊. 书上不是要求只对大 09/07 23:47
- [chinatree] 不用判断这么多情况吧,因为大小写的扫描码是相同的。 09/07 23:21
- [stqcw] 好的我试一试 能加我qq吗?1270911891 09/18 15:33
- [landyking] @stqcw 你在xp下面装个虚拟机.虚拟机厘米那装ms-dos就行了.很好装的啊. http: 09/18 12:10
- [stqcw] 高人 我也在看王爽的汇编 但进行到第十五章的时候 进行 不下去了 虚拟机 我不是很会 设置。能把你的 09/17 19:49
- [stqcw] 高人 我也在看王爽的汇编 但进行到第十五章的时候 进行 不下去了 虚拟机 我不是很会 设置。能把你的 09/17 19:48