番茄遇蜜桃 发表于 2014-1-22 02:39:21

实验7的问题 求鱼友解答

本帖最后由 番茄遇蜜桃 于 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,;定位第一个年份的低16位(2个字节)
                        mov es:,ax;将低16位送入制定位置
                        mov ax, ;定位第一个收入低16位
                        mov es:,ax ;将低16位送入制定位置
                        add si,2h ;准备写入高16位
                        loop s2;写入高16位 ps:年份和收入都是32位(4个字节)所以考虑用2次16位寄存器ax写入指定位置。
             mov ax,ds:;定位雇员数 16位(2个字节)
             mov es:,ax ;写入指定位置
             mov ax, ;准备做除法
             mov dx,
             div word ptr ds: ;开始做除法,定位除数
             mov es:,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

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

番茄遇蜜桃 发表于 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,
             mov es:,ax
             mov ax,
             mov es:,ax
             mov ax,
             mov es:,ax
             mov ax,
             mov es:,ax
             mov ax,ds:
             mov es:,ax
             mov ax,
             mov dx,
             div word ptr ds:
             mov es:,ax
             add bx,4h
             add di,2h
             add bp,10h
             loop s
    mov ax,4c00h
    int 21h
code ends
end start

番茄遇蜜桃 发表于 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,
                                mov es:,ax
                                mov ax,
                                mov es:,ax
                                add si,2
                                loop s2
                        mov ax,
                        mov dx,
                        div word ptr ds:
                        mov es:,ax
                        mov ax,ds:
                        mov es:,ax
                        add bx,4
                        add di,2
                        add bp,16
                        pop cx
                        loop s1
        mov ax,4c00h
    int 21h
code ends
end start

未闻丶花名 发表于 2014-2-9 19:57:03

路过看看= =
页: [1]
查看完整版本: 实验7的问题 求鱼友解答