怎么觉得寄存器不够用呢!!是不是我方法不对?
比如有两个数据段,一个数据段是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的整数倍。程序代码有变换,有可能还要重新算。
我的方法是不是有问题?
感觉用王爽的书,有种很封闭的感觉!