课程设计1
本帖最后由 bin2yx 于 2016-11-18 22:47 编辑assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995';以上是表示21年的21个字符串,84字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据,84字节
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800;以上是表示21年公司雇员人数的21个word型数据,42字节
dw 23 dup (0);拟存入人均收入,多开4个地址备用,地址为252,253,254,255
data ends
stack segment
db 64 dup (0); 刚开始只设了32个位,后来出现溢出错误,加大到64
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,64
call s
call c
call e
mov ax,4c00h
int 21h
s: mov bx,84; 公司总收入起始地址 计算人均收入,存入指定内存………………………………………………………………主程序1
mov si,168; 公司雇员起始地址
mov di,210; 人均收入起始地址
mov cx,21
s1: mov ax,; 这里曾经出现的一个错误,内存中的数据,AX中放不下,应该将高位放在DX中
mov dx,
div word ptr
mov ,ax
add bx,4
add si,2
add di,2
loop s1
mov si,0; 设置原始数据首地址,将ASCII码的数据段,存入指定显存………………………………………………………………主程序2
mov cx,21
mov byte ptr ds:,1
mov byte ptr ds:,8
mov byte ptr ds:,7
mov dh,ds:
mov dl,ds:
mov bl,ds:
s2: push cx
mov cx,4
mov ax,0
s3: mov al,
call show_str
inc si
inc dl
loop s3
pop cx
inc dh
mov ds:,dh
mov dl,ds:
loop s2
ret
c: ;将dd数据段,转换成ASCII码,存入指定显存 ………………………………………………………………主程序3
mov si,84
mov cx,21
mov byte ptr ds:,1
mov byte ptr ds:,27
mov byte ptr ds:,7
mov word ptr ds:,10
c1: mov ax,;ax=16
mov dx,;dx=0
call cc
add si,4
mov al,ds:; 读取并改变显存的行设置,以进行再循环
inc al
mov ds:,al
loop c1
ret
e: ;将dw数据段,转换成ASCII码,存入指定显存 ………………………………………………………………主程序4,这里设置首地址,循环次数,显存地址、性质、除数
mov si,168
mov cx,21
mov byte ptr ds:,1
mov byte ptr ds:,47
mov byte ptr ds:,7
mov word ptr ds:,10
call e1
mov si,210
mov cx,21
mov byte ptr ds:,1
mov byte ptr ds:,67
mov byte ptr ds:,7
mov word ptr ds:,10
call e1
ret
show_str: push dx;本子程序将ax的数值存放到指定显存,dh=指定行,dl=指定列,bl=指定的显示属性,这里没有push完,调用的话要根据需要添加push
push ax
mov ax,0b800h
mov es,ax
mov ax,160
mul dh ;计算所在行的首地址,乘积保存在ax中
add dl,dl ;dl为显示所在的列
sub dl,2
mov dh,0
add ax,dx ;计算出准确目的地的地址,保存在ax中
mov bp,ax ;地址赋值给BX
pop ax
mov es:,al
mov es:,bl
pop dx
ret
divdw:push ax; 子程序,进行32位除16位的除法,并杜绝溢出,dx高位,ax低位,di为除数,cx放结果的余数,dx放高位商,ax放低位商,这里没有push完,调用的话要根据需要添加push
mov ax,dx
mov dx,0
div di
mov si,ax;高位除得的商
pop ax
div di
mov cx,dx;余数放cx
mov dx,si ; 高位除得的商放dx,低位商在ax
ret
cc: push ax; 子程序,目的是将dd数据和dw数据以10进制显示到频幕,应先设置好原始数据首地址si、需要存放到显存的位置、属性(详见C段)、以及10这个被除数的内存地址
push bx
push cx
push di
push si
mov di,ds:
mov bx,0;bx很关键,这个是用来记录压入栈的次数的,是用来设置CX的关键!!!!!
c2: call divdw;
add cx,30h; axdx=商cx=余数+30H
push cx
inc bx ; 这里用来记录压入栈的次数
mov cx,ax ;假如商(ax)为零,就跳转,不为零继续除
jcxz c3
jmp short c2
c3: mov cx,dx
jcxz c4
jmp short c2
c4: ;这里很关键,跳至这里表示所有数据转换完毕,并已压入栈,接下来就是一个一个将他们放入显存
mov cx,bx
mov dh,ds: ;dx改成了设置好的行列数
mov dl,ds:
mov bl,ds: ;bx改成颜色属性
c5: pop ax; 显示的设置开始,将第一个数据放入ax待用,因为数据都与余数,肯定只存放在AL
call show_str
inc dl
loop c5
pop si
pop di
pop cx
pop bx
pop ax
ret
e1: mov ax,; 子程序,没啥大用
mov dx,0
call cc
add si,2
mov al,ds:; 读取并改变显存的行设置,以进行再循环
inc al
mov ds:,al
loop e1
ret
code ends
end start
页:
[1]