|
主题 : : 实验七 没有用到所有寻址方式和所学的所有知识。有请的更好的代码。谢谢指正!!! [待解决] |
回复[ 10次 ]
点击[ 818次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-10-11 15:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-10-08 10:36 |
assume cs:code
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,2369,8000,16000,24486,50065,97479,140417,197514
dd 345980,590872,803530,1183000,1843000,2759000,3753000,4649000,59307000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
db 21 dup(32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov si,168
mov di,210
mov cx,21
s:
mov ax,[bx]
mov [di],ax
mov ax,[bx+2]
mov [di+2],ax
mov ax,[bx+84]
mov [di+5],ax
mov dx,[bx+86]
mov [di+7],dx
div word ptr [si]
mov dx,[si]
mov [di+10],dx
mov [di+13],ax
add si,2
add bx,4
add di,16
loop s
mov ax,4c00h
int 21h
code ends
end start
功能是实现了。可是书中说“这个程序是。。。。,它几乎用到了我们以前学习过的所有知识和编程技巧。...”
实现在实现了。可是没有进一步的改进。欢迎指正。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-10-11 15:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33 |
|
|
|
|
|
[第2楼]
[ 回复时间:2007-10-11 18:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42 |
你没有用到什么知识??
所有知识不等于写的代码都表现出来吧。难道用变址寻址没用立即数寻址也算没用到多有知识么?!楼主太较真了。好的程序,好的逻辑,好的思路,足够了。如果,你认为你没有用到XX知识,那你就再用那些知识做一下。多了有时候不是丰富,反而是累赘。个人观点,欢迎指正。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2007-11-04 18:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53 |
高手啊。程序简洁明了,厉害。
多看别人的代码真长见识啊。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-11-04 19:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53 |
assume cs:code
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,2369,8000,16000,24486,50065,97479,140417,197514
dd 345980,590872,803530,1183000,1843000,2759000,3753000,4649000,59307000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov si,168
mov di,0
mov ax,table
mov es,ax
mov cx,21
s:
mov ax,[bx]
mov es:[di],ax
mov ax,[bx+2]
mov es:[di+2],ax
mov ax,[bx+84]
mov es:[di+5],ax
mov dx,[bx+86]
mov es:[di+7],dx
div word ptr [si]
mov dx,[si]
mov es:[di+10],dx
mov es:[di+13],ax
add si,2
add bx,4
add di,16
loop s
mov ax,4c00h
int 21h
code ends
end start
改编了一下。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-01-08 20:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-12-05 16:47 |
assume cs:code,ds:data,cs: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,2759000,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
data ends
table segment
db 21 dup ('year summ ne ??')
table ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
s:mov al,[bx]
mov [di],al
mov al,[bx+1]
mov es:[di+1],al
mov al,[bx+2]
mov es:[di+2],al
mov al,[bx+3]
mov es:[di+3],al
mov ax,54h[bx]
mov dx,56h[bx]
mov es:5h[di],ax
mov es:7h[di],dx
mov ax,0a8h[si]
mov es:0ah[di],ax
mov ax,54h[bx]
div word ptr ds:0a8h[si]
mov es:0dh[di],ax
add bx,4
add si,2
add di,16
loop s
mov ax ,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-01-08 21:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:40
信誉值:2
注册日期:2007-06-26 11:53 |
|
|
|
|
|
[第7楼]
[ 回复时间:2008-10-10 11:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10 |
|
|
|
|
|
[第8楼]
[ 回复时间:2009-04-10 22:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-15 16:03 |
|
|
|
|
|
[第9楼]
[ 回复时间:2009-05-18 21:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-13 22:27 |
我也做完了。昨天有参考过楼上的贴子!加了点注释.昨天做了5个小时都没做出来!后来发现是心理太浮躁了。
各位借鉴!认真一点的话,很容易的。
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,14417,197514
dd 345980,590827,803530,1183000,1843000,2759000,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
data ends
table segment
db 21 dup(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
table ends
;es指向table
;bx作为行标,列标直接用bx+数字表示 循环一次+16
;ds指向data段
;bp指向年份 相对于ds的变址寄存,循环一次+4
;si指向年收入 相对于dp固定变址
;di指向雇员人数 相对于ds变址,循环一次+2
code segment
start:
mov ax,table
mov es,ax
mov bx,0
mov ax,data
mov ds,ax
mov bp,0H
mov si,54H
mov di,0a8H
mov cx,21
s:
mov al,[bp] ;从data段提数据
mov es:[bx],al ;装到table段中
mov al,[bp+1]
mov es:[bx+1],al ;年份
mov al,[bp+2]
mov es:[bx+2],al ;年份
mov al,[bp+3]
mov es:[bx+3],al ;年份
mov ax,[di] ;雇员人数
mov word ptr es:[bx+0aH],ax ;进行除法运算时,需要占用ax和dx两个寄存器.所以先把人数字段装过去
mov ax,[bp+si] ;年收入,低16位
mov dx,[bp].2[si] ;年收入, 高16位
mov word ptr es:[bx+5],ax ;年收入
mov word ptr es:[bx+7],dx ;年收入
div word ptr [di] ;用除法计算个人收入,商放在ax中,余数在dx中
mov word ptr es:[bx+0dH],ax ;个人收入
add bx,10H ;设置下一行的起始单元
add di,2 ;di指向雇员人数 相对于ds变址,循环一次+2
add bp,4 ;bp指向年份 相对于ds的变址寄存,循环一次+4
loop s
mov ax,4c00H
int 21H
code ends
end start | | |
|
|
|
|
[第10楼]
[ 回复时间:2009-08-05 14:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33 |
楼主的程序不错!我们来看结果
这是我Debug楼主程序的结果,希望你们写程序都加注释!便于别人看,也便于自己日后看
在地址1430:0110处你的商是54H,我的是55H,这里是2390/28的商,你的确是2369/28,要认真啊,你抄错多处了,你再算算你程序里的最后一年收入除以最后一年的人数,也就是59307000/17800=0D03H,你的却只有一个03H?你的商的高位0DH丢了,地址1430:0210处的01H这个数是怎么回事?
你的表格不符合实验要求
-dds:d0 21f
1430:00D0 88 45 31 39 37 35 20 10-00 00 00 20 03 00 20 05 .E1975 .... .. .
1430:00E0 00 20 31 39 37 36 20 16-00 00 00 20 07 00 20 03 . 1976 .... .. .
1430:00F0 00 20 31 39 37 37 20 7E-01 00 00 20 09 00 20 2A . 1977 ~... .. *
1430:0100 00 20 31 39 37 38 20 4C-05 00 00 20 0D 00 20 68 . 1978 L... .. h
1430:0110 00 20 31 39 37 39 20 41-09 00 00 20 1C 00 20 54 . 1979 A... .. T
1430:0120 00 20 31 39 38 30 20 40-1F 00 00 20 26 00 20 D2 . 1980 @... &. .
1430:0130 00 20 31 39 38 31 20 80-3E 00 00 20 82 00 20 7B . 1981 .>.. .. {
1430:0140 00 20 31 39 38 32 20 A6-5F 00 00 20 DC 00 20 6F . 1982 ._.. .. o
1430:0150 00 20 31 39 38 33 20 91-C3 00 00 20 DC 01 20 69 . 1983 .... .. i
1430:0160 00 20 31 39 38 34 20 C7-7C 01 00 20 0A 03 20 7D . 1984 .|.. .. }
1430:0170 00 20 31 39 38 35 20 81-24 02 00 20 E9 03 20 8C . 1985 .$.. .. .
1430:0180 00 20 31 39 38 36 20 8A-03 03 00 20 A2 05 20 88 . 1986 .... .. .
1430:0190 00 20 31 39 38 37 20 7C-47 05 00 20 D2 08 20 99 . 1987 |G.. .. .
1430:01A0 00 20 31 39 38 38 20 18-04 09 00 20 E9 0A 20 D3 . 1988 .... .. .
1430:01B0 00 20 31 39 38 39 20 CA-42 0C 00 20 C5 0F 20 C7 . 1989 .B.. .. .
1430:01C0 00 20 31 39 39 30 20 18-0D 12 00 20 03 16 20 D1 . 1990 .... .. .
1430:01D0 00 20 31 39 39 31 20 38-1F 1C 00 20 22 20 20 E0 . 1991 8... " .
1430:01E0 00 20 31 39 39 32 20 58-19 2A 00 20 16 2D 20 EF . 1992 X.*. .- .
1430:01F0 00 20 31 39 39 33 20 28-44 39 00 20 5E 38 20 04 . 1993 (D9. ^8 .
1430:0200 01 20 31 39 39 34 20 28-F0 46 00 20 99 3B 20 30 . 1994 (.F. .; 0
1430:0210 01 20 31 39 39 35 20 F8-F3 88 03 20 88 45 20 03 . 1995 .... .E . | | |
|