|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
努力了好几个小时,终于有了回报。。。。。。小甲鱼老师的讲解还没看,测试下自己学的扎实不扎实,发完此贴继续看小甲鱼老师的讲解,欢迎纠错,千万别喷我- -- 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,[si] ;用寄存器ax录入,算是自己能想到的小小的优化吧
- mov dx,2[si] ;dx空着,压榨劳动力,不努力工作不给你奖金,嘿嘿
- mov es:[bx+di],ax
- mov es:[bx+di+2],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,[si] ;不只为何,循环的标号写成c就会报错,一会查查,
- mov es:[bx+di],ax ;偏移地址si刚好指向雇员数,通过循环,通过ax寄存器将人数数据依次送入bx与di控制的数组中
-
- mov ax,es:5[bx] ;除法了,求平均收入
- mov dx,es:7[bx]
- div word ptr [si]
- mov es:0dh[bx],ax
-
- add bx,10h
- add si,2 ;si指向下一个数据,一个数据占一个字的空间,所以si+2
- loop d
-
- mov ax,4c00h
- int 21h
-
- code ends ;没了
- end start ;真的没了
复制代码 |
|