课程设计1,哪错了?求高手指点
assume cs:codesg,ds:data,es:tabledata 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'
;以上是表示21年的21个字符串,4字节0~53h
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收的21个dword型数据,4字节54~0a7h
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;以上是表示21年公司雇员人数的21个word型数据,2字节0a8~0d2h
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
codesg segment
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov si,0
mov di,0
mov dx,0
s: mov al,
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
;输入地一个年份
mov ax,ds:54h
mov es:5,ax ;输入第一个收入
mov ax,ds:0a8h
mov es:0ah,ax
mov ax,ds:54h
mov dx,ds:54h
mov ax,ds:0a8h
mov es:0dh,ax
div word ptr es:0a8h
mov es:0ch,ax
add bx,0a0h
add si,4
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
本帖最后由 莫名其妙 于 2012-3-9 19:49 编辑
一点点说
mov al,
mov es:,al 这个好理解
mov al,
mov es:,al 但是这里按说应该是存放颜色的位置
别忘记了内存中应该是 数据 颜色 数据 颜色.......这样排列的 al放数据 ah放颜色 如果你要放数据需要加2才是下一个数据的位置
mov al, 这下面的都一样
mov es:,al
mov al,
mov es:,al
本帖最后由 顺qi吇繎 于 2012-3-10 16:14 编辑
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'
;以上是表示21年的21个字符串 0-53H
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 234980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据 054H-0A7H
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据 0A8H-0D1H
data ends
stack segment
dw 20 dup(0)
stack ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,40
mov dh,2 ;显示 行
mov cx,21
mov di,0
mov bx,0
s: push cx
mov cx,4
mov dl,24 ;列
s1: mov al, ;读取年份 存入ax
mov ah,0
inc dl
call show_str
inc di
loop s1
mov dl,35 ;列
push dx
mov si,0
mov ax,ds: ;读取公司总收入的低16位 存入ax
mov dx,ds: ;读取公司总收入的高16位 存入dx
call dtoc ;将数字转换成10进制形式的字符串格式,并显示
add sp,2
mov dl,45 ;列
push dx
mov si,0
mov dx,0
mov ax,ds: ;读取雇用人数存入ax
call dtoc ;显示人数
add sp,2
mov dl,55 ;列
push dx
mov si,0
mov ax,ds: ;读取公司总收入的低16位 存入ax
mov dx,ds: ;读取公司总收入的高16位 存入dx
div word ptr ds: ;算出人均收入,结果存入ax
mov dx,0
call dtoc ;显示平均收入
add sp,2
inc dh ;行数+1
add bx,2
pop cx
loop s
mov ax,4c00h
int 21h
dtoc:
mov cx,0ah
call divdw
add cx,30h ;将cx(余数)+30h 转换为该数字的ASCII码的对应字符 0对30H 1对31H...9对39H
push cx ;利用压栈出栈的逆序原理,将最多10个字符串逆序排列
inc si
mov cx,ax ;将商放入CX并判断是否为0,为0则该数已经被分解完成,否则继续分解.
jcxz okax
jmp short dtoc
okax:mov cx,dx ;低16位 ax的值为0时,转到这里判断DX的值是否为0
jcxz okdx ;如果dx也为0,则跳到结束.
jmp dtoc ;如果dx不为0,返回去继续取余数
okdx:mov cx,si ;将压入的字符个数送入CX,来调整POP次数
mov dx, word ptr ss: ;行dh 列dl
s2:pop ax
call show_str
inc dl
loop s2
ret
divdw: push di ;此处为不溢出除法
mov di,ax
mov ax,dx
mov dx,0
div cx
xchg di,ax
div cx
mov cx,dx
mov dx,di
pop di
ret
show_str:
push bx
push ax
mov al,dh ;以下将 ((行数-1)*160 + b8000H)/16 = 段地址ES
dec al
mov bl,0ah
mul bl
add ax,0b800h
mov es,ax
;以下将(列数-1)*2 转换为本行的偏移字节数 存放在bx中
mov al,dl
dec al
mov bl,2
mul bl
mov bx,ax
pop ax
mov byte ptr es:,al ;偶数位存放字符闪烁 背景 高亮 前景
mov byte ptr es:,7 ;奇数位存放颜色.0 000 0 111 为黑底白字
pop bx
ret
codesg ends
end start
本帖最后由 顺qi吇繎 于 2012-3-10 16:08 编辑
s: mov al,
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
这个地方的读写存在问题,建议仔细研究一下屏幕缓存区的数据结构,偶字节存字符,奇字节存颜色,存入是:
mov byte ptr es:,al,并且你的把年份的第二个数写入了奇字节,第三个又在偶字节,第四个又在奇字节,这样肯定会出现彩虹
顺qi吇繎 发表于 2012-3-10 15:49 static/image/common/back.gif
assume cs:codesg
data segment
辛苦了,谢谢啊
页:
[1]