. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  终于做完【实验七】啦。  [待解决] 回复[ 6次 ]   点击[ 629次 ]  
regex
[帖 主]   [ 发表时间:2010-01-15 14:56 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
现在脑子乱得很, 满脑子的0~9a-f ^_^

我用的是最笨的方法,笔墨纸砚都用上啦。。。

root@yeah /cygdrive/d/asm
$ cat lab7.asm
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'

dd      16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,17514
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,5636,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 cx,21         
        mov bp,0         
;复制年, 分两次操作
s:      mov ax,[si]       
        mov es:[bx],ax     
        mov ax,[si+2]      
        mov es:[bx+2],ax   
;复制收入, 分两次操作
        mov ax,[si+54h]    
        mov es:[bx+5],ax   
        mov ax,[si+56h]    
        mov es:[bx+7],ax   
;复制人数
        mov ax,[bp+0a8h]        
        mov es:[bx+0ah],ax       
;开始除法操作
        mov dx,es:[bx+7]         
        mov ax,es:[bx+5]         
        div word ptr es:[bx+0ah]
        mov es:[bx+0dh],ax
;增量操作
        add si,4
        add bp,2
        add bx,10h

        loop s

        mov ax,4c00h
        int 21h

codesg  ends
end     start


root@yeah /cygdrive/d/asm
$
实验结果如下:

-d es:0 14f
1417:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
1417:0010  31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
1417:0020  31 39 37 37 20 7E 01 00-00 20 09 00 20 2A 00 20   1977 ~... .. *.
1417:0030  31 39 37 38 20 4C 05 00-00 20 0D 00 20 68 00 20   1978 L... .. h.
1417:0040  31 39 37 39 20 56 09 00-00 20 1C 00 20 55 00 20   1979 V... .. U.
1417:0050  31 39 38 30 20 40 1F 00-00 20 26 00 20 D2 00 20   1980 @... &. ..
1417:0060  31 39 38 31 20 80 3E 00-00 20 82 00 20 7B 00 20   1981 .>.. .. {.
1417:0070  31 39 38 32 20 A6 5F 00-00 20 DC 00 20 6F 00 20   1982 ._.. .. o.
1417:0080  31 39 38 33 20 91 C3 00-00 20 DC 01 20 69 00 20   1983 .... .. i.
1417:0090  31 39 38 34 20 C7 7C 01-00 20 0A 03 20 7D 00 20   1984 .|.. .. }.
1417:00A0  31 39 38 35 20 81 24 02-00 20 E9 03 20 8C 00 20   1985 .$.. .. ..
1417:00B0  31 39 38 36 20 6A 44 00-00 20 A2 05 20 0C 00 20   1986 jD.. .. ..
1417:00C0  31 39 38 37 20 7C 47 05-00 20 D2 08 20 99 00 20   1987 |G.. .. ..
1417:00D0  31 39 38 38 20 EB 03 09-00 20 E9 0A 20 D3 00 20   1988 .... .. ..
1417:00E0  31 39 38 39 20 CA 42 0C-00 20 C5 0F 20 C7 00 20   1989 .B.. .. ..
1417:00F0  31 39 39 30 20 18 0D 12-00 20 04 16 20 D1 00 20   1990 .... .. ..
1417:0100  31 39 39 31 20 38 1F 1C-00 20 22 20 20 E0 00 20   1991 8... "  ..
1417:0110  31 39 39 32 20 58 19 2A-00 20 16 2D 20 EF 00 20   1992 X.*. .- ..
1417:0120  31 39 39 33 20 28 44 39-00 20 5E 38 20 04 01 20   1993 (D9. ^8 ..
1417:0130  31 39 39 34 20 28 F0 46-00 20 99 3B 20 30 01 20   1994 (.F. .; 0.
1417:0140  31 39 39 35 20 68 97 5A-00 20 88 45 20 4D 01 20   1995 h.Z. .E M.
-
-
验证一下:
root@yeah /cygdrive/d
$ sh d2h.sh 5937000
5937000's hexcode is:5A9768

root@yeah /cygdrive/d
$ sh d2h.sh 17800
17800's hexcode is:4588

root@yeah /cygdrive/d
$ echo "ibase=obase=16;5A9768/4588"|bc
14D

【心得】
开始觉得挺容易的, 可是真做起来还真费了不少脑筋!, 开始想用栈操作, 可是后来一想, 还是多练练mov吧, 地址呀, 偏移呀, 算的脑袋都大啦~,这个题做起来真枯燥, 一遍一遍调试, 找错,,, 还好, 给做出来啦~~
csusuntao
[第1楼]   [ 回复时间:2010-01-28 23:37 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:2
注册日期:2010-01-04 23:00
我也贴一个自己做的。感觉做的时候思路确实很乱,算着算着就蒙啦。

assume cs:code_seg

data_seg 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_seg ends

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

stack_seg segment
    db 8 dup(0)
stack_seg ends

code_seg segment

start:
    mov ax, data_seg
    mov ds, ax
    
    mov ax, table_seg
    mov es, ax
    
    mov ax, stack_seg
    mov ss, ax
    mov sp, 10H
    
    mov bx, 0
    mov bp, 0
    mov di, 0
    mov cx, 21
    S1:
        push cx
        mov si, 0
        mov cx, 4
        S2:                       ; save the year
            mov al, ds:[bp+si]
            mov es:[bx+si], al
            add si, 1
        LOOP S2
        pop cx
        
        mov ax, ds:[bp+84]        ; save the money
        mov dx, ds:[bp+2+84]
        mov es:[bx+5], ax
        mov es:[bx+2+5], dx
        
        div word ptr ds:[di+84+84]  ; the the average
        mov es:[bx+5+5+3], ax
        
        mov ax, ds:[di+84+84]    ; save the employee number
        mov es:[bx+5+5], ax
        
        add bp, 4
        add di, 2
        add bx, 16
    LOOP S1
        
     mov ax, 4C00H
     int 21H
code_seg ends

end start
regex
[第2楼]   [ 回复时间:2010-01-31 00:42 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
没错儿~~~, 老觉得脑子不够用的~~~^_^
regex
[第3楼]   [ 回复时间:2010-02-05 15:27 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
有个bug, 如果在[...]中使用bp, 必须显式的指明段寄存器, 否则, 默认的就是SS。
mov ax,[bp+0a8h]   
改为
mov ax,ds:[bx+0a8h]
coolman
[第4楼]   [ 回复时间:2010-02-06 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-02 15:08
昨晚做了这个练习。最大的体会是,原始数据的访问是关键。仔细观察发现要用循环的方式逐条读出并处理各个年份的数据,针对原始数据设计一个合理的寻址方式很关键。仔细观察 发现如果原始数据每年数据的各个域,长度有2种,4 byte: 年 ,收入 ;2 byte:人数 。于是可以考虑用两个reg 在每次循环中分别递增4和2,以这种方式步进到下一年份相应的数据域。只要解决了这个问题,其它的就简单了。
体会:汇编程序设计一定要注意观察原始数据。从原始数据在内存中的排列方式开始你就已经开始程序设计了。合理的数据排列方式,直接影响到后面的算法。这道练习如果原始数据也按年份逐条排列(和目标数据一样)处理起来就容易多了。
strawer
[第5楼]   [ 回复时间:2010-02-07 16:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-03 13:33
我觉得编写时一个合适的寻址写法有助于我们理解程序,比如在写入总收入时,我是这么写的:
mov ax,84[si+0]
mov es:[di+5],ax
mov ax,84[si+2]
mov es:[di+7],ax
84就是收入数据的开始,初始si=0,表示第一年的收入数据开始,循环时一次加4,到下一年的收入数据开始处。mov ax,84[si+0]先读入前两个字节,mov ax,84[si+2]读入下两个字节
7_plz
[第6楼]   [ 回复时间:2010-04-05 00:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-27 20:47
请问下楼主在linux下用的什么汇编编译器
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved