EIO 发表于 2013-1-10 16:25:26

《汇编语言(第二版)》实验七,EIO版参考答案

努力了好几个小时,终于有了回报。。。。。。小甲鱼老师的讲解还没看,测试下自己学的扎实不扎实,发完此贴继续看小甲鱼老师的讲解,欢迎纠错,千万别喷我- -assume cs:code,ds:data,es:table,ss:stack

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

table segment

        db 21 dup ('year summ ne ?? ')
       
table ends                                       ;以上是实验七数据

stack segment

        dw 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 si,0                                    
        mov di,0
        mov bx,0                                    ;从头开始,为偏移地址的各个寄存器置零
        mov cx,2                                        ;总结data数据段发现:年份与收入所需空间均为4字节,循环两次,将年份与收入录入内存中的表格

a:        push cx                                       ;cx入栈,双重循环
        mov cx,21                                     ;年份与收入部分均为21份数据,循环21次,实现全部录入
       
        b:        mov ax,                               ;用寄存器ax录入,算是自己能想到的小小的优化吧
                mov dx,2                              ;dx空着,压榨劳动力,不努力工作不给你奖金,嘿嘿
                mov es:,ax                        
                mov es:,dx                     ;为内存中所谓的表格赋值,(相对)基址变址寻址用上
               
                add bx,10h                              
                add si,4                                  ;bx控制行,si继续寻找数据段中的下一个数据,由于ax一次传输16位数据,由于dx跟着一起传输数据,所以si+4
        loop b
       
        mov di,5
        mov bx,0                                    ;第二次循环开始录入收入,di控制列,bx重新置零,控制行
       
        pop cx                                       
        loop a
       
        mov cx,21                                     ;传输数据以及计算平均收入,均循环21次,所以cx置为21
        mov di,0ah                                    ;di还是控制列,di置为雇员的地址,0ah,bx循环后已置零                                 
       
d:        mov ax,                                 ;不只为何,循环的标号写成c就会报错,一会查查,
        mov es:,ax                           ;偏移地址si刚好指向雇员数,通过循环,通过ax寄存器将人数数据依次送入bx与di控制的数组中
       
        mov ax,es:5                               ;除法了,求平均收入
        mov dx,es:7
        div word ptr
        mov es:0dh,ax
       
        add bx,10h
        add si,2                                    ;si指向下一个数据,一个数据占一个字的空间,所以si+2
        loop d
       
        mov ax,4c00h
        int 21h
       
code ends                                          ;没了

end start                                          ;真的没了

メ㊣逆ご帅☆ 发表于 2013-1-10 17:12:26

帮顶。,。
、。

s0512 发表于 2013-1-10 18:18:25

很好,继续加油!
页: [1]
查看完整版本: 《汇编语言(第二版)》实验七,EIO版参考答案