![]() |
#2
zklhp2012-10-23 16:23
|
可是这样我就发现段寄存器不够用了。
我把ds段寄存器指向年份段,es指向人数段。cs和ss我不能动对吧!这样我发现没用寄存器指向人均收入段了。
幸好我发现人数段和人均收入段的数据类型是一样的,所以我让它们共用es段寄存器,只是偏移值不同,人均收入段的数据固定和人数段有一个固定的偏移值。

Income segment;每年的收入为一个dword型数据,即4个字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000
dd 5937000
Income ends
IncomeStr segment
db 21 dup(' ');8个字符 字节 只用了7个
IncomeStr ends
;..................................................................................................
;..................................................................................................
Employees segment;每年的员工人数为一个word型数据,即2个byte
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037
dw 5635,8226,11542,14430,15257,17800
Employees ends
EmployeesStr segment
db 21 dup(' ');6个字符 字节,只用了5个
EmployeesStr ends
;..................................................................................................
;..................................................................................................
Perincome segment
dw 21 dup(32)
Perincome ends
;这里省去一些代码,直接进入关键代码
step0:;计算人均收入
mov ax,Income ;把收入设为数据段ds +si
mov ds,ax
mov ax,Employees ;把员工人数设为扩展段es+di
mov es,ax
mov si,0
mov di,0
mov cx,21
loop1:
push cx
mov dx,ds:[si+2]
mov ax,ds:[si]
mov cx,es:[di]
push dx
push ax
push cx
call divdw
mov es:[di+176],ax;把人均收入设为es段 es+di+176,人均收入段和员工人数段偏移距离是176
add si,4
add di,2
pop cx
loop loop1
可是这样解决方法好像很蹩脚。两个数据段的数据格式一样才能这样共用段寄存器和和偏移寄存器,还要加上固定的偏移值。这个偏移值还要自己手动算。太不灵活了,算的过程中还要注意段的起始地址必须是16的整数倍。程序代码有变换,有可能还要重新算。dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000
dd 5937000
Income ends
IncomeStr segment
db 21 dup(' ');8个字符 字节 只用了7个
IncomeStr ends
;..................................................................................................
;..................................................................................................
Employees segment;每年的员工人数为一个word型数据,即2个byte
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037
dw 5635,8226,11542,14430,15257,17800
Employees ends
EmployeesStr segment
db 21 dup(' ');6个字符 字节,只用了5个
EmployeesStr ends
;..................................................................................................
;..................................................................................................
Perincome segment
dw 21 dup(32)
Perincome ends
;这里省去一些代码,直接进入关键代码
step0:;计算人均收入
mov ax,Income ;把收入设为数据段ds +si
mov ds,ax
mov ax,Employees ;把员工人数设为扩展段es+di
mov es,ax
mov si,0
mov di,0
mov cx,21
loop1:
push cx
mov dx,ds:[si+2]
mov ax,ds:[si]
mov cx,es:[di]
push dx
push ax
push cx
call divdw
mov es:[di+176],ax;把人均收入设为es段 es+di+176,人均收入段和员工人数段偏移距离是176
add si,4
add di,2
pop cx
loop loop1
我的方法是不是有问题?
感觉用王爽的书,有种很封闭的感觉!