在这个程序中,要用到前10章几乎所有的知识。(书中原话)
课程设计的需求:
将之前实验7的数据在屏幕上展示出来
如图所示: 该图也是我的程序展示图
分析:
首先需要展示四大块内容,分别是:
1.年份(字符串数据,可以直接展示,不需要转化字符串)
2.收入(dword数据,需要先转化为字符串,再进行展示)
3.雇员(word数据,需要先转化为字符串,再进行展示)
4.人均收入(word数据,需要先转化为字符串,再进行展示)
接着,该以怎样的方式展示?
这里我选择一次展示一整列的数据,因为这样数据类型是一样的,比较好把握.
那么就是说按照四块内容分别展示四次,每次展示21个数据
分析完毕。
(这个程序最头疼的还是定位地址和寄存器冲突的问题,所以我把数据分成多个数据段,并且在每个小程序开始前面存储好即将使用的寄存器就解决了这个问题)
开始之前我们需要确定需要的几个小程序
1.展示小程序showptr,前面实验10写过
2.word数据转化字符串小程序dtoc,前面实验10写过
3.除法溢出问题解决小程序divdw,前面实验10写过
4.dword数据转化为字符串小程序dtoc2,没写过,需要自己写
那么先把没写过的小程序写出来:
原理和word数据转化字符串是一样的,只不过变成了双字的数据类型
代码如下,该程序将实现转化并且将12345678展示出来:
assume cs:code,ds:data,ss:stack
data segment
db 20 dup(0)
data ends
stack segment
dw 20 dup(0)
stack ends
code segment
start:
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,40
mov ax,614eh
mov dx,0bch
mov si,0
call dtoc_2 ;将dword型数据转变成十进制字符串,字符串以0结尾,存放于data段
mov dh,12
mov dl,64
mov cl,02h
mov si,0
call showptr ;显示字符串 dh是行,dl是列,cl是颜色,ds:si指向字符串首地址
mov ax,4c00h
int 21h
;dword转化10进制字符串 字符串以0结尾
;参数 ax 低16,dx 高16, ds:si 指向字符串首地址
dtoc_2:
push ax
push bx
push cx
push dx
push di
push si
mov di,0 ;计数器置0
dtoc2_s0:
mov cx,10;除数为10
call divdw ;做dword除法 dx存放高16位结果 ax存放低16位结果 cx存放余数
add cx,30h ;余数加30h
push cx ;存放ascii码,入栈
inc di ;计数器加1
;判断商是否为0,此时的商是32位的结果,需要将商相加一下
mov cx,ax