復襍 发表于 2015-11-23 18:37:18

终于做出来了, 课程设计1

本帖最后由 復襍 于 2016-10-18 13:08 编辑


.;把数值显示在屏幕上
assume cs:code,ds:data
data segment
db 10 dup (0)
data ends

info segment
;每个21个数据

;年份 84字节
db '1975','1976','1977','1978','1979','1980','1981','1982'
db '1983','1984','1985','1986','1987','1988','1989','1990'
db '1991','1992','1993','1994','1995'


;收入 84字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

;雇员人数 42字节
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11452,14430,15257,17800

info ends

table segment
db 21 dup('year summ ne ?? ')
db 'year summ ne ?? '
table ends

code segment
start:
;把数据存入表格
mov ax,info
mov ds,ax ;设置ds段 指向info

mov ax,table
mov es,ax ;设置es段 指向table

mov bx,0 ;bx代表行
mov si,0 ;si代表 年份 收入
mov di,0 ;di代表 雇员 人均收入
mov cx,21 ;初始化
s:
;年份处理
mov ax, ;把data的年份放到ax中
mov es:,ax ;把ax中的年份放到内存
mov ax, ;把data的年份放到ax中
mov es:,ax ;把ax中的年份放到内存

;收入处理
mov ax, ;把收入保存在ax
mov es:,ax
mov dx, ;把收入保存在dx
mov es:,dx

;处理人均收入
div word ptr ;dx*10000H+ax/雇员数 商ax 余数dx
mov es:,ax


;雇员处理
mov ax, ;把雇员保存在ax
mov es:,ax


;置0
mov byte ptr es:,0
mov byte ptr es:,0
mov byte ptr es:,0

add si,4
add di,2
add bx,16
loop s

;------------------------------
;把数据显示出来
mov ax,table
mov ds,ax
mov si,0 ;ds:si指向table首地址

;显示年份
mov cx,21
mov bl,1 ;列
show:
push cx

mov dh,bl ;行号
mov dl,30 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str

;显示收入
add si,5
mov ax, ;收入高16位
add si,2 ;收入低16位
mov dx,
push si ;si入栈
mov si,336
call dtoc ;将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
mov dh,bl ;行号
mov dl,35 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
pop si ;si在出栈

;显示雇员
add si,3 ;雇员数
mov ax,
mov dx,0
push si ;si入栈
mov si,336
call dtoc ;将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
mov dh,bl ;行号
mov dl,43 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
pop si ;si在出栈

;显示人均收入
add si,3 ;人均收入
mov ax,
mov dx,0
push si ;si入栈
mov si,336
call dtoc ;将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
mov dh,bl ;行号
mov dl,49 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
pop si ;si在出栈

pop cx
inc bl
add si,3
loop show

mov ax,4c00h
int 21h

;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数: (ax)=数据低16位;
; (dx)=数据高16位;
;ds:si指向字符串首地址。
;返回:无。
dtoc:
push ax
push bx
push cx
push dx

mov bx,0
continue1:
mov cx,10 ;设置除数
call divdw
add cl,30h ;变为ascii码
mov ch,0 ;把高8为置为0,以便存入栈中和循环
push cx ;保存
inc bx ;增加字符数
mov cx,ax
inc cx ;如果商为0 加一以便退出
loop continue1

;写入内存
mov cx,bx ;把字符数保存到cx以便循环使用
mov bx,0 ;把bx置为0 以便定位字符
continue2:
pop ax
mov ,al
inc bx
loop continue2
mov al,0
mov ,al ;把最后一个字符置0

pop dx
pop cx
pop bx
pop ax
ret


;名称:divdw
;功能:除法不会溢出
;参数:
; ax 被除数16位
; dx 被除数16位
; cx 除数
;返回: 结果
; ax商低16位
; dx商高16位
; cx余数16位
divdw:
push si
push di

mov di,ax ;di暂时存放ax

mov ax,dx
mov dx,0
div cx
mov si,ax ;si存放商
mov ax,di ;di的值给回ax
div cx
mov cx,dx
mov dx,si
pop di
pop si
ret

;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24);
; (dl)=列号(取值范围0~79);
; (cl)=颜色;
; ds:si指向字符串的首地址。
;返回:无。
show_str:
push ax
push cx
push dx
push si
push di
push es

mov ax,0b800h
mov es,ax

dec dh
mov al,0A0h
mul dh ;al*dh显存的行号
mov di,ax

mov al,2
mul dl
sub ax,2
add di,ax ;di显存的行号+行号
mov ah,cl
write:
mov cl,
jcxz ok
mov es:,cl ;字符
mov es:,ah ;颜色

add di,2
add si,1
jmp write

ok:
pop es
pop di
pop si
pop dx
pop cx
pop ax
ret




code ends
end start




代码:
有什么不对请指教.

康小泡 发表于 2015-11-23 20:08:16

做的不错啊

zph888 发表于 2015-11-24 11:58:52

结果显示在屏幕上还不会,先关注一下

零度非安全 发表于 2015-11-24 12:26:05

楼主继续加油{:7_113:}

hiwch 发表于 2015-11-24 12:29:42

支持支持楼主
页: [1]
查看完整版本: 终于做出来了, 课程设计1