. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  新手、调试N久才弄出来的。  [待解决] 回复[ 5次 ]   点击[ 631次 ]  
qq8581518
[帖 主]   [ 发表时间:2013-02-25 21:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-01 22:53
assume cs:code,ds:data,ss: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,5973000 

           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
        mov ax,table
        mov es,ax
        mov bx,0
        mov si,0

        mov cx,21
years:        mov dx,cx
        mov cx,4
        mov di,0
yearss:        mov al,[si]
        mov es:[bx+di],al
        inc si
        inc di
        loop yearss
        add bx,16
        mov cx,dx
        loop years
        
        mov bx,0
        mov si,0
        mov cx,21
gz:        mov dx,cx
        mov cx,4
        mov di,0
gzs:        mov al,[si+84]
        mov es:[bx+di+5],al
        inc si
        inc di
        loop gzs
        mov cx,dx
        add bx,16
        loop gz

        mov bx,0
        mov si,0
        mov cx,21
s:        mov ax,[bx+168]
        mov es:[si+10],ax
        add bx,2
        add si,16
        loop s

        mov si,0
        mov di,0
        mov cx,21
        mov ax,es
        mov ss,ax
sq:        mov dx,[si+86]
        mov ax,[si+84]
        mov bx,[di+168]
        div bx
        mov [bp+13],ax
        add si,4
        add di,2
        add bp,16
        loop sq

        mov ax,4c00h
        int 21h        
code ends
end start
stop1204
[第1楼]   [ 回复时间:2013-05-10 02:36 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
太复杂了-.- .看我的吧   刚学用2个钟写完的

assume cs:codesg
data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'        ;1个年份占4字节
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995';以上表示21年的21个字符串        ;data:53        84个字节
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514        ;1个数据占4字节
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上表示21年公司总收入的21个dword型数据                ;data:A7  ;21*4(84)+84=168个字节单元
        dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 
        dw 11542, 14430, 15257, 17800        ;1个数据占2个字节
        ;以上表示21年公司雇员人数的21个word型数据                ;data:D1 ;168+21*2(42)=210个字节单元
data ends
table segment
        db 21 dup ('year summ ne??')
table ends
codesg 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,[si]
        mov es:[bx],ax
        mov ax,[si].2
        mov es:[bx].2,ax


        mov ax,[si].84
        mov es:[bx].5,ax
        mov ax,[si].86
        mov es:[bx].7,ax

        mov ax,[di].168
        mov es:[bx].0AH,ax


        mov ax,es:[bx].5
        mov dx,es:[bx].7
        div word ptr [di].168
        mov es:[bx].0DH,ax

        add bx,10H
        add di,2
        add si,4
        loop s
        mov bx,0
        mov cx,21
s0:        mov byte ptr [bx].5,20H                ;空格  或 mov al,20H  mov [bx].4,al
        mov byte ptr [bx].10,20H                ;必须放在s循环条件后,不然将覆盖dd-dw定义的数据
        mov byte ptr [bx].13,20H
        mov byte ptr [bx].16,20H
        add bx,10h
        loop s0

        mov ax,4c00h
        int 21h
codesg ends
end start
kkbenben
[第2楼]   [ 回复时间:2013-06-08 18:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-13 00:10
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994'
db '1995'

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803430,118300,1843000,274900,3753000,4649000,5937000

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,3037,5635,8226
dw 11542,14430,15257,17800
data ends

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

codesg segment
start: mov ax,data
       mov ds,ax
           mov ax,table
           mov es,ax
           mov bx,0
           mov si,0
           mov di,0
           mov bp,0
           mov cx,21
        s: mov ax,[bx+si]
           mov es:[bp],ax
           mov dx,[bx+si+2]
           mov es:[bp+2],dx
           add bx,84
           mov ax,[bx+si]
           mov dx,[bx+si+2]
           mov es:[bp+5],ax
           mov es:[bp+7],dx
           add bx,84
           div word ptr ds:[bx+di]
           mov dx,ds:[bx+di]
           mov es:[bp+10],dx
           mov es:[bp+13],ax
           mov bx,0
           add bp,16
           add si,4
           add di,2
           loop s
           mov ax,4c00h
           int 21h
codesg ends
end start

仅一个 循环就可以完成
lsgdt
[第3楼]   [ 回复时间:2014-03-06 17:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-10-22 15:27
2楼XXX
jumpbird
[第4楼]   [ 回复时间:2014-09-02 17:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-08-29 19:48
我的这个测试通过了,但是就最后三轮循环被除数写入不正确,也不知道什么原因,求高手解答!(我怎么想都想不通,前18次循环都正常):

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,5973000  

           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 

stack segment 
        dw 16 dup (0)
stack ends 

code segment  
start:  mov ax,stack 
        mov ss,ax 
        mov sp,32 

        mov word ptr ss:[0],0                ;存放年份偏移地址
        mov word ptr ss:[2],84
        mov word ptr ss:[4],168

        mov ax,data
        mov ds,ax
        
        mov ax,table
        mov es,ax

        mov bx,0 
        mov cx,21                         ;外循环21次
        mov dx,0

s0:        push cx                                ;外循环计数器暂存到栈 
        mov si,ss:[0] 
        mov di,0
        mov cx,4                         ;内循环4次
        
s:      mov al,[si]
        mov es:[bx+di],al
        inc si
        inc di
        loop s 

        mov ss:[0],si

        mov si,ss:[2]
        inc di
        mov ax,[si]
        mov es:[bx+di],ax
        add si,2
        add di,2
        mov dx,[si]
        mov es:[bx+di],dx

        add si,2
        mov ss:[2],si

        mov si,ss:[4]
        add di,3
        mov cx,[si]
        mov es:[bx+di],cx
        div cx

        add si,2
        mov ss:[4],si

        add di,3
        mov es:[bx+di],ax

        add bx,16
        pop cx 
        loop s0 

        mov ax,4c00h 
        int 21h 
code ends 

end start
gyq
[第5楼]   [ 回复时间:2014-09-03 04:23 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2014-08-02 21:25
用你的程序后三轮执行结果:
                            被除数位置       除数     商
1409:0200  31 39 39 33  20  28 44 39-00  20  5E 38 20 04 01 20   1993 (D9. ^8 ..
1409:0210  31 39 39 34  20  28 F0 46-00  20  99 3B 20 30 01 20   1994 (.F. .; 0.
1409:0220  31 39 39 35  20  08 24 5B-00  20  88 45 20 4F 01 20   1995 .$[. .E O.

00394428H = 3753000
0046F028H = 4649000
005B2408H = 5973000

在我这边用你的程序结果都对。
有瑕疵的地方是程序di没有赋初值,给dx赋初值0有点多余,但这都不影响程序执行结果。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved