王爽 汇编语言 第二版 实验七 寻址方式在结构化数据访问中的使用 源码

时间:2020-12-24 19:26:14

这是学习汇编以来遇到的最繁琐的一个程序,其实思路理清了也就是那么回事,但还是花了一整个晚上才把它写出来,晒晒

assume cs:code 

data segment
	db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
	db '1985','1986','1987','1988','1989','1990','1991','1992','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 ends


table segment                ;定义一个叫table的段,格式如下'year summ ne ?? '
	db 21 dup ('year summ ne ?? ')  ;实际就是确定每个数据占几个字节
table ends


stack segment
	dw 0,0,0,0,0,0,0,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,10h
		
		
		;下面把年份和总收入放入表中
		
		mov si,0		
		mov cx,21     ;定义循环次数
		mov di,0      
		
	s0:               
		push cx 
		mov bx,0
		mov cx,4
		
	s1:
		mov al ,[bx+di]
		mov es:[bx+si],al   ;把年份放入表中
		mov al ,84[bx+di]
		mov es:[bx].5[si],al  ; 把总收入放入表中	
		
		inc bx
		
		loop s1
		
			add di,4H      ;取下一年份或是总收入,往后推4个字节
			add si,10H
			pop cx
		loop s0
		
		
		;下面把雇员数放入表中	
		mov bx,0
		mov si,0
		mov cx,21
		
	s3:
		mov ax ,168[bx]
		mov es:0ah[si],ax
		
		add bx,2
		add si,10H

		loop s3
		
		
		;下面计算人均收入
	calculate:
		mov si,0
		mov cx,21   ;定义循环次数
		
	s:
		mov ax,es:5[si]  ;将总收入放到AX,DX
		mov dx,es:7[si]
		div WORD ptr es:0Ah[si] ;编译过程中遇到错误:instruction operand must have size,原因是没指定操作数是字型 还是字节型的
		
		mov es:0dh[si], ax   ;将商放到指定位置
		add si,16 				;处理下一个
		loop s
		
		mov ax,4c00H
		int 21h
				
code ends
end start
运行成功,但可能不是最精简的代码,回头去网上看看