鱼C论坛

 找回密码
 立即注册
查看: 1596|回复: 1

实验7的问题 求鱼友解答

[复制链接]
发表于 2014-1-22 02:39:21 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 番茄遇蜜桃 于 2014-1-22 02:41 编辑

assume cs:codesg,ds:datasg,es:tablesg,ss:stacksg
datasg 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 11452,14430,15257,17800
datasg ends
tablesg segment
    db 21 dup ('year summ ne ?? ')
tablesg ends
stacksg segment
dw 0,0,0,0,0,0,0,0  ;定义一个栈
stacksg ends
codesg segment
start:  mov ax,datasg
        mov ds,ax    ;赋源数据段地址
        mov ax,tablesg
        mov es,ax     ;赋目标段地址
        mov ax,stacksg
        mov ss,ax
        mov sp,10h    ;初始化客
        mov bx,0
        mov si,0
        mov di,0               
        mov bp,0
        mov cx,21    ;外循环控制行数
    s1:            push cx ;保护cx
            mov cx,2  ;写入每行数据
        s2:                mov ax,[bx+si]  ;定位第一个年份的低16位(2个字节)
                        mov es:[bp+si],ax  ;将低16位送入制定位置
                        mov ax,[bx+si+54h] ;定位第一个收入低16位
                        mov es:[bp+5h+si],ax ;将低16位送入制定位置
                        add si,2h ;准备写入高16位
                        loop s2  ;写入高16位 ps:年份和收入都是32位(4个字节)所以考虑用2次16位寄存器ax写入指定位置。
             mov ax,ds:[di+0a8h]  ;定位雇员数 16位(2个字节)
             mov es:[bp+0ah],ax ;写入指定位置
             mov ax,[bx+54h] ;准备做除法
             mov dx,[bx+56h]
             div word ptr ds:[di+0a8h] ;开始做除法,定位除数
             mov es:[bp+0dh],ax;将除法的商写入指定位置  ps:本行数据写入完成
             add bx,4h;开始定位下个32位数据(年份和收入)准备下一行数据
             add di,2h ;开始定位下个16位数据(雇员数)准备第下一行数据
             add bp,10h;目标位置换下一行地址
             pop cx;弹出cx值
             loop s1;返回写入下一行数据
    mov ax,4c00h
    int 21h
codesg ends
end start

无法通过编译不知道有什么错误,肯定大家帮我看看。谢谢~~
大致算法如上。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-22 12:30:56 | 显示全部楼层
栈定义不正确, 取消栈。 取消内循环结果正常。修改后代码。
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 11452,14430,15257,17800
data ends
table segment
    db 21 dup ('year summ ne ?? ')
table ends
code segment
start:  mov ax,data
        mov ds,ax   
        mov ax,table
        mov es,ax     
        mov bx,0
        mov di,0               
        mov bp,0
        mov cx,21   
      s:     mov ax,[bx]  
             mov es:[bp],ax  
             mov ax,[bx+54h]
             mov es:[bp+5h],ax
             mov ax,[bx+2h]  
             mov es:[bp+2h],ax  
             mov ax,[bx+56h]
             mov es:[bp+7h],ax
             mov ax,ds:[di+0a8h]  
             mov es:[bp+0ah],ax
             mov ax,[bx+54h]
             mov dx,[bx+56h]
             div word ptr ds:[di+0a8h]
             mov es:[bp+0dh],ax
             add bx,4h
             add di,2h
             add bp,10h
             loop s
    mov ax,4c00h
    int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-23 21:04:09 | 显示全部楼层
再不改变原来思路的基础上 终于想明白,下面贴出来一切正常源码。
assume cs:code,ds:data,es:table,ss:stack
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 11452,14430,15257,17800
data ends
table segment
    db 21 dup ('year summ ne ?? ')
table ends
stack segment stack
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:  mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
                mov ax,stack
                mov ss,ax
                mov sp,16
        mov bx,0
        mov di,0               
        mov bp,0
        mov cx,21
    s1:            push cx
                mov si,0
                        mov cx,2
            s2:     mov ax,[bx+si]
                                mov es:[bp+si],ax
                                mov ax,[bx+si+84]
                                mov es:[bp+si+5],ax
                                add si,2
                                loop s2
                        mov ax,[bx+84]
                        mov dx,[bx+86]
                        div word ptr ds:[di+168]
                        mov es:[bp+13],ax
                        mov ax,ds:[di+168]
                        mov es:[bp+10],ax
                        add bx,4
                        add di,2
                        add bp,16
                        pop cx
                        loop s1
        mov ax,4c00h
    int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-9 19:57:03 | 显示全部楼层
路过看看= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 09:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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