| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1011 人关注过本帖
标题:汇编语言 实验七的小问题
只看楼主 加入收藏
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
结帖率:97.3%
收藏
已结贴  问题点数:3 回复次数:11 
汇编语言 实验七的小问题
程序代码:
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'  ;year占4个bytes
    db      '1993','1994','1995'                                            ;0-53               0-53是54个字节。

    dd        16,22,382,1356,2390,8000,16000,24486,50065,97497,140417,197514
    dd        345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000        ;收入占4个bytes     54-0A7

    dw        3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226;                      0A8-D2
    dw        11542,14430,15257,17800                                                     ;人数占2个

data ends

table segment

    db    21 dup ('ssssssssssssssss')

table ends

code segment

start:

    mov        ax, data
    mov        ds, ax

    mov        ax, table
    mov        es, ax

    mov        bx, 0
    mov        si, 0
    mov     di, 0
    mov        cx, 21        ;初始循环次数

s:
    mov     ax, ds:[bx]
    mov     es:[si+0], ax
    mov     ax, ds:[bx+2]
    mov     es:[si+2], ax;                              bx每次增加4字节,si每次增加16字节

    mov     byte ptr es:[si+4], 20h
    ;;;;;;;;;;;;;;;;;;;;;;;                                         完成存储year 和 空格

    mov     ax, ds:54h[bx]
    mov     es:[si+5], ax
    mov     dx, ds:56h[bx]
    mov     es:[si+7], dx

    mov     byte ptr es:[si+9], 20h
    ;;;;;;;;;;;;;;;;;;;;;                                             完成存储 收入 和空格

    mov     di, ds:0A8h[si]           ;这是问题----->          ;这不能用「si」,si每次循环加4,而人数是两个字节。如果改成这样的话      mov     (这没有寄存器可用了), ds:0A8h[di]
    mov     es:[si+10], di

    mov     byte ptr es:[si+12], 20h
    ;;;;;;;;;;;;;;;;;;;;;;;                                             未完成存储 人数

    div     di
    mov     es:[si+13], ax

    mov     byte ptr es:[si+15], 20h
    ;;;;;;;;;;;;;;;;;;;;;;;                                             完成存储人均收入

    add     bx, 4
    add     si, 16

loop s

    mov        ax, 4c00h
    int        21h

code ends


end start



[ 本帖最后由 admin_xyz 于 2012-8-29 10:18 编辑 ]
搜索更多相关主题的帖子: color 
2012-08-29 10:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
又长分又少 等大牛来回答罢。。
2012-08-29 10:32
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
下次多给点么。。。如果每次问都给20分,没问几次就没分了。。

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-08-29 12:27
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
亲爱的版主,帮帮忙么。

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-08-29 12:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
让有容就大帮你看看罢 呵呵
2012-08-29 12:46
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
如果只是寄存器不够用你可以把相应的地址放在内存变量里嘛 这个就算是指针罢 或者可以压栈保存
2012-08-29 12:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:2 
为什么不在数据段定义时搞几个空格? 这样写程序时简单点
找到对应的位置 直接div word ptr ds:[di].xxx就OK了啊

梅尚程荀
马谭杨奚







                                                       
2012-08-29 12:51
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
哇 给Z版打打下手吧~~
帮你改了下 你的问题是 存放雇员数时寄存器搞复杂了 其实可以直接用di来指定它在数据段的位置 你搞混了后就会除法溢出

改了几个地方 可以看下
程序代码:
;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件

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'  ;year占4个bytes
    db      '1993','1994','1995'                                            ;0-53               0-53是54个字节。

    dd        16,22,382,1356,2390,8000,16000,24486,50065,97497,140417,197514
    dd        345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000        ;收入占4个bytes     54-0A7

    dw        3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226;                      0A8-D2
    dw        11542,14430,15257,17800                                                     ;人数占2个

data ends

table segment

    db    21 dup ('ssssssssssssssss')

table ends

code segment

start:

    mov        ax, data
    mov        ds, ax

    mov        ax, table
    mov        es, ax

    mov        bx, 0
    mov        si, 0
    mov     di, 0
    mov        cx, 21        ;初始循环次数

s:
    mov     ax, ds:[bx]
    mov     es:[si+0], ax
    mov     ax, ds:[bx+2]
    mov     es:[si+2], ax;                              bx每次增加4字节,si每次增加16字节

    mov     byte ptr es:[si+4], 20h
    ;;;;;;;;;;;;;;;;;;;;;;;                                         完成存储year 和 空格

    mov     ax, ds:54h[bx]
    mov     es:[si+5], ax
    mov     dx, ds:56h[bx]
    mov     es:[si+7], dx

    mov     byte ptr es:[si+9], 20h
    ;;;;;;;;;;;;;;;;;;;;;                                             完成存储 收入 和空格

  ;  mov     di, ds:0A8h[si]           ;这是问题----->          ;这不能用「si」,si每次循环加4,而人数是两个字节。如果改成这样的话      mov     (这没有寄存器可用了), ds:0A8h[di]
   ; mov     es:[si+10], di
    div     WORD ptr ds:0A8H[di]
    mov     es:[si + 13], ax
   

    mov     ax, ds:0A8h[di]
    mov     es:[si + 10], ax
    mov     byte ptr es:[si+12], 20h
    ;;;;;;;;;;;;;;;;;;;;;;;                                             未完成存储 人数


    mov     byte ptr es:[si+15], 20h
    ;;;;;;;;;;;;;;;;;;;;;;;                                             完成存储人均收入

    add     di, 2
    add     bx, 4
    add     si, 16

loop s

    mov        ax, 4c00h
    int        21h

code ends


end start

debug了下 没问题
图片附件: 游客没有浏览图片的权限,请 登录注册


梅尚程荀
马谭杨奚







                                                       
2012-08-29 14:04
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
to 有容:
当然可以直接除人数的内存单元

 mov     di, ds:0A8h[si]           ;可是[]这个里面必须要放一个单独的寄存器啊,单独+2byte     mov     di, ds:0A8h[si]


用栈麻烦了些吧。

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-08-29 14:11
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 9楼 admin_xyz
我的意思是除数可以直接用data段里的那个位置的数 除完了 把AX也就是商放大es:xxx中就OK了啊 为什么还要再搞个寄存器来转换? 你再考虑下
也就是说直接使用一个di 寄存器 他的初始值是0 不要去牵扯si了吧 。


[ 本帖最后由 有容就大 于 2012-8-29 14:16 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-08-29 14:15
快速回复:汇编语言 实验七的小问题
数据加载中...
 
   



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

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