汇编学习笔记八

实验七

寻址方式在结构化数据访问中等的应用

要求

  • 将data段中的数据按照如下格式写到table段中,并计算21年中的人均收入
  • 结果也按照下面的格式保存在table段中
assume cs:code,ds:data,ss:stack

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'
		;以上是表示21年的21个字符串 year      偏移地址  0


		dd	16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
		dd	345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
		;以上是表示21年公司总收入的21个dword数据	sum   偏移地址 84

		dw	3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
		dw	11542,14430,15257,17800     ;表示每年的人数  偏移地址  168

data ends

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

stack segment stack
	db	128 dup (0)
stack ends



code segment

start:	mov ax,data
		mov ds,ax   ;设置数据段

		mov ax,stack
		mov ss,ax
		mov sp,128 ;设置栈段

		mov ax,table
		mov es,ax ;表示目的段地址  ds位源段地址

		mov si,0      ;ds
		mov di,84     ;ds
		mov bp,168    ;ds
		mov bx,0	  ;es 

		mov cx,21
						;'year summ ne ?? '
num:	push ds:[si]
		pop es:[bx]
		push ds:[si+2]   
		pop es:[bx+2]	;将年份栈  year被替换

		mov ax,ds:[di]
		mov dx,ds:[di+2]
		mov es:[bx+5],ax
		mov es:[bx+7],dx  ;表示将summ充填

		push ds:[bp]
		pop es:[bx+10]

		div word ptr ds:[bp]
		mov es:[bx+13],ax

		add si,4
		add di,4
		add bp,2
		add bx,10H
		loop num




		mov ax,4C00H
		int 21H



code ends



end start

解释:
mov si,0 ;ds
mov di,84 ;ds
mov bp,168 ;ds
mov bx,0 ;es

其中使用es:[bx]来访问目的内存,即需要复制到哪里的地址

使用ds:[si]来访问年份的内存

使用ds:[di]来访问每年的收入

使用ds:[bp]来访问每年的员工数

'year summ ne ?? '这个占十六个字节,先使用21行这个字符串来表示这个table 然后将年份 每年收入 员工人数和平均工资充填其中

在求平均工资时使用的是16位除数,因此使用dx和ax分别作为被除数的高16位和低16位,商的结果存放在ax中,再讲ax移动到table表中的对应位置 es:[bx+13]

每一次循环表示充填一行数据即将 ‘year summ ne ??’ 替换成 年份 每年收入 员工人数和平均工资

下面这几条指令分别定义了ds的偏移地址分别表示 年份 每年收入和员工人数的偏移地址

mov si,0      ;ds
mov di,84     ;ds
mov bp,168    ;ds
mov bx,0	  ;es 

处理年份时使用两个入栈出栈的操作才能将一个年份存入 year 位置

push ds:[si]
pop es:[bx]
push ds:[si+2]   
pop es:[bx+2]	;将年份栈  year被替换		

下面这几条指令表示将 年份 每年收入 员工人数和’year summ ne ??'向后移动一个单位

add si,4
add di,4
add bp,2
add bx,10H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值