鱼C论坛

 找回密码
 立即注册
查看: 3587|回复: 7

[技术交流] 复杂的实验7 享受过程 对错我都努力过

[复制链接]
发表于 2011-6-26 17:31:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:codesg  

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'
;以上是表示21年的21个字符(0-53h)

dd  16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd  345980,590827,803530,1183000,184300,2759000,3753000,4649000,5937000
;(54h-0a7h)

dw 3,7,9,13,20,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;(0a8h-0d1h)

data ends

table segment
db 21 dup('year summ ne ?? ')
table ends

stack segment
dw 8 dup(0)
stack ends

codesg segment
start:mov ax,table
        mov es,ax
        mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax               ;把table stack data与寄存器挂钩
        mov sp,16         
        mov bx,0
        mov cx,21               ;设定外循环次数
s0:   push cx
        mov si,0
        mov di,0                ;si di寄存器值0  
        mov cx,4
s:     mov ax,ds:[bx+si]
        mov es:[bx+0d2h+di],ax   ;通过ax间接转移ds:[bx+si]中的数据.放入段地址es开始偏移地址[bx+0d2h+di]中
        mov ax,ds:[bx+54h+si]
        mov es:[bx+0deh+di],ax
        inc si
        inc di
        add bx,2
        loop s
        add bx,16
        pop cx                    ;取出cx值 避免死循环  
        loop s0
        mov si,0                       
        mov di,0
        mov bx,0a8h
        mov cx,21
s2:   push cx            
        mov si,0
        mov di,0
        mov cx,2                   ;因为ne对应的只有2字节数据。不能4次循环。重新设定循环次数。不知道我的理解对不对
s3:   mov ax,ds:[bx+si]
        mov es:[bx+16h+di],ax
        inc si
        inc di
        add bx,2
        loop s3
        add bx,16
        pop cx
        loop s2
        mov bx,0                  ;重设bx为零 因为收入中前9个数据没有大于65536 分开来循环 然后放入??中  能不能放一起循环
                                        ;我还在思考 有个困惑在这里 debug中首先定义的
         mov cx,9                  ;数据怎么查不到 d ds:0完全看不到数据 输入d ds:120才能查询到数据 但我不确定这到底是定义起始
s4:    mov ax,ds:[bx+54h]   ;的数据 还是程序结束时的数据 狂纠结中
        div byte ptr ds:[bx+0a8h]
        mov es:[bx+di+0d2h],ax
        add di,16
        add bx,2
        loop s4
        mov bx,77h
        mov cx,12
s5:   mov ax,ds:[bx]
        mov dx,ds:[bx+2]
        div word ptr ds:[bx+26h]
        mov es:[bx+di+0d2h],ax
        add di,16
        add bx,2
        loop s5
        mov ax,4c00h
        int 21h
codesg ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-26 19:51:41 | 显示全部楼层
我才学到第六章    代码量太大了  看的我头晕:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-26 22:03:23 | 显示全部楼层
  add bx,2
        loop s
        add bx,16
这里开始 bx貌似就一直在加吧?而且上面这里
mov es:[bx+0d2h+di],ax   ;通过ax间接转移ds:[bx+si]中的数据.放入段地址es开始偏移地址[bx+0d2h+di]中
为什么要设置偏移地址在0d2h?感觉好乱.
一步一步写下来。也不容易啊。一起加油吧:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-26 22:15:16 | 显示全部楼层
我刚开始学习的时候,就记得鱼老师说过。要学习思路而不是死记硬背。我发现楼主思路很乱。
我的学习方法是。看着视频做笔记,用笔把重点的记录下来。了解每一个题目的思路,看完弄不懂的地方在看书,跟视频结合一下。再不懂的地方就问百度。然后再拿一个干净的本子整理笔记。以后做题的时候哪里忘了就翻翻笔记看看。熟话说好记忆不如烂笔头嘛。前面的知识掌握的好了,现在学起来轻松的多。呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-26 22:35:28 | 显示全部楼层
哈哈 确实乱 实际我没看完第8.6章 等我贯彻了甲鱼哥的精神 理清了思路 再来写个优化的 最迟后天来上新代码 :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-27 00:09:06 | 显示全部楼层
努力学哦,终有一天我也会明白的,哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 00:26:36 | 显示全部楼层
优化版本出炉 请看代码 :lol
assume cs:code,ds:data,es: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            ;把data段定义为ds段
       mov ax,table      
       mov es,ax          ;把table段定义为es段               
       mov bx,0             ;初始化
       mov di,0            
       mov si,0
       mov cx,21           ;年份人均收入排名年收入都需要更改21次,所以设定循环21次
    s: mov ax,[bx]       ;修改年份,4个字节就是2个字 把al改为ax 程序简化4步   
       mov es:[si],ax   
       mov ax,[bx+2]
       mov es:[si+2],ax     
                              
       mov ax,[bx+54H]                  ;修改年收入
       mov es:[si+5],ax
       mov ax,[bx+56h]              
       mov es:[si+7],ax                 
                                
       mov ax,[di+0a8h]          ;修改人数 人数占的2个字节 用bx si就不能通用循环 di就起到作用了
       mov es:[si+0ah],ax               
                                    
       mov ax,[bx+54h]              ;增加人均收入
       mov dx,[bx+56h]
       div word ptr es:[0a8h+si]
       mov es:[0dh+si],ax                      
                                    
       add di,2                                                
       add bx,4                       
       add si,16                     
      
       loop s                          
       mov ax,4c00h                     
       int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-7-1 22:48:39 | 显示全部楼层
看看老帖,学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 07:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表