怎么觉得寄存器不够用呢!!是不是我方法不对?
比如有两个数据段,一个数据段是21年总收入(年份段),一个数据段是21年每年员工人数(人数段)。我要计算每年的人均收入,即用每年的总收入除以每年的员工人数。把计算的结果保存到另一数据段中(人均收入段)。可是这样我就发现段寄存器不够用了。
我把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的整数倍。程序代码有变换,有可能还要重新算。我的方法是不是有问题?
感觉用王爽的书,有种很封闭的感觉!








