. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第8章 试验7实现代码  [待解决] 回复[ 9次 ]   点击[ 407次 ]  
ruder
[帖 主]   [ 发表时间:2013-05-05 21:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37
assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
    db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
    db '1989', '1990', '1991', '1992', '1993', '1994', '1995'

    dd 16,     22,      382,     1356,    2390,    8000,    16000
    dd 24486,  50065,   97479,   140417,  197514,  345980,  590827
    dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000

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

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

code segment
start:
    mov     ax, data                    ; 使ds指向data
    mov     ds, ax

    mov     ax, table                   ; 使es指向table
    mov     es, ax

    sub     bx, bx                      ; 把data段看做数组
                                        ; 令bx为数组下标

    sub     di, di                      ; 把table段看做结构
                                        ; 令di为结构基地址

    mov     cx, 21                      ; 设定循环次数
again:
    mov     si, bx                      ; 下标bx乘以2后存入si
    add     si, si

    mov     ax, ds:[si]                 ; 存入年份
    mov     dx, ds:[si + 02h]
    mov     es:[di], ax
    mov     es:[di + 02h], dx

    mov     ax, ds:[054h + si]          ; ax为收入的低16位
    mov     dx, ds:[054h + si + 02h]    ; dx为收入的高16位
    mov     es:[di + 05h], ax           ; 存入收入
    mov     es:[di + 05h + 02h], dx

    mov     bp, ds:[0a8h + bx]          ; 存入雇员数
    mov     es:[di + 0ah], bp

    div     bp                          ; 除以雇员数得到平均工资
    mov     es:[di + 0dh], ax           ; 存入平均工资

    add     bx, 02h                     ; 继续处理下一组数据
    add     di, 010h
    loop    again

    mov     ax, 4c00h                   ; 程序退出
    int     21h
code ends

end start
ruder
[第1楼]   [ 回复时间:2013-05-05 21:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37
也可以写成下面的等价形式
ruder
[第2楼]   [ 回复时间:2013-05-05 21:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37
assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
    db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
    db '1989', '1990', '1991', '1992', '1993', '1994', '1995'

    dd 16,     22,      382,     1356,    2390,    8000,    16000
    dd 24486,  50065,   97479,   140417,  197514,  345980,  590827
    dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000

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

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

code segment
start:
    mov     ax, data                    ; 使ds指向data
    mov     ds, ax

    mov     ax, table                   ; 使es指向table
    mov     es, ax

    sub     bx, bx                      ; 把data段看做数组
                                        ; 令bx为数组下标

    sub     di, di                      ; 把table段看做结构
                                        ; 令di为结构基地址

    mov     cx, 21                      ; 设定循环次数
again:
    mov     si, bx                      ; 下标bx乘以2后存入si
    add     si, si

    mov     ax, ds:[si].0               ; 存入年份
    mov     dx, ds:[si].2
    mov     es:[di].0, ax
    mov     es:[di].2, dx

    mov     ax, ds:054h.[si].0          ; ax为收入的低16位
    mov     dx, ds:054h.[si].2          ; dx为收入的高16位
    mov     es:[di].5, ax               ; 存入收入
    mov     es:[di].7, dx

    mov     bp, ds:0a8h.[bx]            ; 存入雇员数
    mov     es:[di].0ah, bp

    div     bp                          ; 除以雇员数得到平均工资
    mov     es:[di].0dh, ax             ; 存入平均工资

    add     bx, 02h                     ; 继续处理下一组数据
    add     di, 010h
    loop    again

    mov     ax, 4c00h                   ; 程序退出
    int     21h
code ends

end start
1217682981
[第3楼]   [ 回复时间:2013-05-08 21:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-04-24 15:23
想问一下,我不知道在debug里怎么执行和查看,不知道用什么命令让他执行,能不能截图帮我一下,谢谢啦
ruder
[第4楼]   [ 回复时间:2013-05-10 11:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37
耐心看看书上35页
stop1204
[第5楼]   [ 回复时间:2013-05-11 08:31 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
哪一行是输入空格的指令.....
ruder
[第6楼]   [ 回复时间:2013-05-11 11:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37
空格已经在table段中,难道还需要再输入一次?(不需要输入!!!)
stop1204
[第7楼]   [ 回复时间:2013-05-13 08:03 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
回复:[第6楼]
------------------
没注意 所以多写了一堆-.-         .........
.........................-.-  不是 ,, 原来是定义错了,   table段少定义2个空格, 所以导致显示的时候 全错了
stop1204
[第8楼]   [ 回复时间:2013-05-13 08:32 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
我在努力缩减   要执行的机器码次数 ,,  -.- 就是你那个  要运行48行 才能运行到int 21H


我已经把原来的不是数组源码从60几行缩到56 -.-  52行了....  现在要重新想下数组的
stop1204
[第9楼]   [ 回复时间:2013-05-13 10:06 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
好像差不多.....................


assume cs:codesg                ;   机器指令48行   cx=27A
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
        sub bx,bx
        sub si,si
        sub di,di
        mov cx,21
s:        ;年份
                mov ax,[si].0
                mov es:[bx].0,ax
                mov ax,[si].2
                mov es:[bx].2,ax
                ;收入
                mov ax,[si].84
                mov es:[bx].05H,ax
                mov dx,[si].86
                mov es:[bx].07H,dx
                ;雇员
                mov bp,[di].168
                mov es:[bx].0AH,bp
                ;平均收入
                div bp
                mov es:[bx].0dH,ax
                add bx,10h
                add si,4
                inc di
                inc di
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved