| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 892 人关注过本帖
标题:怎么觉得寄存器不够用呢!!是不是我方法不对?
只看楼主 加入收藏
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
结帖率:71.43%
收藏
已结贴  问题点数:20 回复次数:5 
怎么觉得寄存器不够用呢!!是不是我方法不对?
比如有两个数据段,一个数据段是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的整数倍。程序代码有变换,有可能还要重新算。


我的方法是不是有问题?
感觉用王爽的书,有种很封闭的感觉!
搜索更多相关主题的帖子: 人均收入 寄存器 
2012-10-23 15:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:13 
我把ds段寄存器指向年份段,es指向人数段。cs和ss我不能动对吧!这样我发现没用寄存器指向人均收入段了。

幸好我发现人数段和人均收入段的数据类型是一样的,所以我让它们共用es段寄存器,只是偏移值不同,人均收入段的数据固定和人数段有一个固定的偏移值。

完全可以所有的都在一个段里。。

这个偏移值还要自己手动算。太不灵活了,算的过程中还要注意段的起始地址必须是16的整数倍。程序代码有变换,有可能还要重新算。

确实是啊 不知道王老师为啥这么设计 按理说 这里完全可以像高级语言那样 用定义变量的思路来理解

aaa dw 111, 222, 333
bbb db 11, 22, 55

我用哪个 就把哪个的偏移量也就是地址取了

lea si, aaa

然后 我不就可以用si来操作那些数了么

貌似王爽的书后面会讲这个罢 如果不讲 那真是麻烦的很啊

如果觉得这里比较封闭 可以加快速度或者先浏览一下后面的东西嘛 学习要主动 当然 基础要打好

祝楼主学习顺利 觉得好记得结题 不明白欢迎继续问
2012-10-23 16:23
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:7 
寄存器应该够用吧 那个程序设计的思路还是不错 可以多看几遍。

梅尚程荀
马谭杨奚







                                                       
2012-10-23 16:47
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
收藏
得分:0 
回复 2楼 zklhp
版主大大给的几个定义变量的指令我现在还没学到,看来我目前只能这样了。到后面后再改
2012-10-23 17:06
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
收藏
得分:0 
我会结贴的!
2012-10-23 17:08
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
计算机的CPU寻址方式 请大哥哥查一下吧

寄存器 内存 立即数 就这么3种的组合
而且操作数中至少有个寄存器或者立即数的

可以这么说 要么是从外部到内部,或者内部到外部,或者内部之间

也就是说,CPU的操作是一个数据流向的问题  

你完全可以让暂时不用的数据段让出 DS或者ES  让要用的数据段占用DS ES 进行操作赛

我要成为嘿嘿的黑客,替天行道
2012-10-30 09:41
快速回复:怎么觉得寄存器不够用呢!!是不是我方法不对?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028533 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved