汇编语言课程设计一
啊啊啊,表示楼主受不了,课程设计一已经做了好几天了,但是仍然做不出来,我的问题是:1.首先人均收入到底是哪个寄存器的值,人均收入如何计算,人均收入如何放置啊
2.为何别人的代码可以直接用div(总收入/人数),却没有出现除法溢出,而我试下不行啊,他的代码如下:(是狂潮的,我复制下)assume cs:codesg, ds:data, es:data2
data segment
db 32 dup(20H)
data ends
data2 segment
; 年份
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
db '1991', '1992', '1993', '1994', '1995'
; 收入
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479
dd 140417,197514, 345980, 590827, 803530, 1183000, 1843000
dd 2759000, 3753000, 4649000, 5937000
; 雇员数
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793
dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
data2 ends
codesg segment
start:
mov ax, data
mov ds, ax
mov ax, data2
mov es, ax
mov cx, 21
mov bp, 0 ; 年份的首地址
mov bx, 54H ; 收入的首地址
mov di, 0a8H ; 雇员数的首地址
mov dh, 4 ; 从第4行开始逐行显示表格
mov dl, 0 ; 从第0列显示每行信息
s:
push cx
push dx
mov si, 0 ; 字符串的首地址
; 复制年份
mov ax, es:
mov , ax
mov ax, es:2
mov 2, ax
add si, 9 ; 9列显示年份
; 复制收入
mov ax, es: ; 收入的低16位
mov dx, es:2 ; 收入的高16位
call dtoc
add si, 9 ; 9列显示收入
; 复制雇员数
mov ax, es:
mov dx, 0
call dtoc
add si, 9 ; 9列显示雇员数
; 复制人均收入
mov ax, es: ; 收入的低16位
mov dx, es:2 ; 收入的高16位
div word ptr es:
mov dx, 0
call dtoc
mov byte ptr 3, 0 ; 字符串结束标志设为0
pop dx
mov cl, 2 ; 字符显示为绿色
call show_str
inc dh ; 行数+1
add bp, 4 ; 下一个年份
add bx, 4 ; 下一个收入
add di, 2 ; 下一个雇员数
pop cx
loop s
mov ax, 4c00H
int 21H
; 子程序dtoc
dtoc:
push bx
push cx
push si
mov bx, 0
s00:
mov cx, ax
jcxz ok
mov cx, 10
call divdw
add cx, 30H ; 余数转换为ASCII
push cx ; 余数入栈
inc bx ; 数字位数+1
jmp short s00
ok:
mov cx, bx
c2m:
pop bx
mov , bl
inc si
loop c2m
pop si
pop cx
pop bx
ret
; 子程序divdw
divdw:
push bx
mov bx, ax ; 低16位L暂时存在bx
mov ax, dx ; 高16位H送到ax
mov dx, 0
div cx ; H/N
push ax ; int(H/N)入栈
mov ax, bx
div cx ; /N
mov cx, dx ; 余数送到cx
pop dx ; int(H/N)出栈
pop bx
ret
; 子程序show_str
show_str:
push ax
push bx
push bp
push cx
push si
push di
push es
mov bl, cl ; 字体颜色存在bl中
mov ax, 0b800H
mov es, ax ; 显示缓冲区的段地址存在es
mov ax, 0a0H
mul dh
mov bp, ax ; 将第n行的首地址存在bp
mov ax, 2
mul dl
mov di, ax ; 将第n列存在di
mov si, 0
ctom:
mov ch, 0
mov cl,
jcxz exit
mov es:, cl
inc di
mov es:, bl
inc si
inc di
jmp short ctom
exit:
pop es
pop di
pop si
pop cx
pop bp
pop bx
pop ax
ret
codesg ends
end start
为何他的代码直接除,就可以,我试下就不行.,唉,真受不了了,求解啊.
我的代码为何除法溢出了assume cs:code,ds:data,es:table
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
dw 260,304,333
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:
mov si,0
mov di,0
mov bx,0
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
push cx
s5:
mov ax,ds:
mov es:,ax
mov ax,ds:
mov es:,ax
mov ax,ds:
mov es:,ax
mov dx,ds:
mov es:,dx
mov cx,ds:
mov es:,cx
call chufa
mov es:,ax
add di,16
add si,4
add bx,2
pop cx
loop s5
;kaishi
mov ax,table
mov ds,ax
mov ax,0b800h
mov es,ax
mov di,0
mov si,0
mov cx,21
s4:
push cx
mov ax,ds:
mov es:,al
mov es:,ah
mov ax,ds:
mov es:,al
mov es:,ah
mov ax,2
mov es:,al
mov es:,al
mov es:,al
mov es:,al ;year
add si,32
call dtoc2
mov ax,ds:
mov dx,ds: ;sum income
add si,32
call dtoc2
mov ax,ds:
add si,64 ;people
call dtoc2
mov ax,ds: ;average
call dtoc2
add di,16
add si,32
pop cx
loop s4
mov ax,4c00h
int 21h
;除法
chufa:
push bx
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
;转换2进制数据,并且变为ascii值
dtoc2:
push cx
push di
push bx
push si
push dx
mov si,0
mov di,0
mov bx,10
s: mov dx,0
div bx
mov cx,ax
jcxz keyi
add dx,30h
push dx
inc di
jmp s
keyi:
add dx,30h
push dx
inc di
mov cx,di
s3:
pop dx
mov es:,dl
mov ax,2
mov es:,al
add si,2
loop s3
pop dx
pop si
pop bx
pop di
pop cx
ret
code ends
end start 求解{:5_100:} {:5_100:}
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改为了0。所以。。。。。不用我说了吧 那个狂潮这里代码,直接div word ptr es:为何不会除法溢出,十分不解,我试了,为何不行啊
; 复制人均收入
mov ax, es: ; 收入的低16位
mov dx, es:2 ; 收入的高16位
div word ptr es:
mov dx, 0
没大神吗?,自顶 本帖最后由 缌唸 于 2016-3-3 22:26 编辑
哈哈,楼主解决了,太高兴了,会了,{:5_109:} {:5_109:} 一大堆问题。push cx要放到循环里面。年份显示完后,为什么要调用dtoc2? 看得出你程序思路是先将数据写入表格,再从表格显示到显存。你把数据写入表格就已经出错了,所以后面你从表格读取数据都出错。 聆云 发表于 2016-3-3 22:56
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改 ...
谢谢,你看我的代码把,我的问题我已经明白了,不过感谢你看我的程序,毕竟放了两天都没人回,逼得我自己搞懂了, 最佳答案就给你吧。 不客气,能自己解决,收获更大 狂潮的程序有bug....在dtoc那里。用divdw计算后,cx放余数,dx 放商的高16位,ax放商的低16位,然后判断商是否为0时,只判断了商的低16位是否为0,那高16位呢?为什么不判断?难道低16位为0就认为高16位也为0?? 聆云 发表于 2016-3-4 13:40
狂潮的程序有bug....在dtoc那里。用divdw计算后,cx放余数,dx 放商的高16位,ax放商的低16位,然后判断商 ...
嗯嗯
页:
[1]