汇编_结构化数据访问(实验7)

汇编语言(王爽)实验7

实验要求:
编程将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整) 结果也按照下面格式保存在table段中

本实验难度偏适中,主要理解思路和一个关键点的处理即可

具体思路和解释见代码区域

assume cs:codesg

data segment
	;076a:0000 起始地址,每次递增4Byte
	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 * 4 = 84byte
	
	
	;076a:0054  起始地址,每次递增4Byte
	dd 16, 22, 382, 1356, 2390,8000, 16000, 24486, 50065, 97479, 140417, 197514 
	dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
	;21 * dw = 42word = 84byte
	
	
	;076a:00a8 起始地址,每次递增2Byte
	dw 3, 7, 9, 13, 28, 38, 130, 220, 76, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 
	dw 11542, 14430, 15257, 17800
	;21*字 = 42byte
	
data ends

table segment
	;076a:00e0 起始地址
	db 22 dup ('year summ ne ?? ')
	;076a:00e0+10h 存放数据地址
table ends

stack segment
	dw 16 dup (0) ;栈空间
stack ends

codesg segment
start:
	mov ax, data
	mov ds, ax			;ds指向内存数据去
	
	mov ax, stack      
	mov ss, ax          ;ss指向栈区
	mov sp, 16 
	
	mov ax, table
	mov es, ax			;es指向table区
	
	mov bx, 10h			;外层循环的游标
	mov di, 0			;数据区  db, dd, dw
	mov cx, 21			;外层循环的次数
	outter:
		push cx			;将外层循环次数入栈
		
		mov cx, 4
		mov si, 0		;在es指向的table区每一行的游标
		
		inner1:
			mov al, [di + 0]
			mov es:[bx+si], al
			inc si
			inc di
			loop inner1
		;inner内循环将年份数据送入到table区
			
		mov byte ptr es:[bx+si], ' '
		inc si
		
		
		mov cx, 2   ;两次inner2内循环即可
		sub di, 4   ;di为4,此时需要将di为0,以便将dd数据区送入到table区
		inner2:
			mov ax, [di + 0054h]
			mov es:[bx+si], ax
			add si, 2
			add di, 2
			loop inner2
		;inner2内循环是将 收入 送入到 table区
		mov byte ptr es:[bx+si], ' '
		inc si
		
		
		push di			;di为4入栈
		sub di, 4
		mov ax, di      ;被除数的低字段
		mov dx, 0		;被除数的高字段
		mov di, 2       ;除数
		div di
		mov di, ax      ;将商赋给di
		;找dw段的位置
		;db增长为 0 , 4, 8, 12, 16, 20
		;dd增长为 0 , 4, 8, 12, 16, 20
		;dw增长为 0 , 2, 4, 6, 8, 10.....
		;故dw的di为   di = (di - 4) / 2
		;由于结果:商 可能为di,为16位,所以使用ax, dx来表示被除数
		
		mov ax, [00a8h + di] 
		mov es:[bx+si], ax  ;将雇员数送到table区
		add si, 2
		pop di      ;di出栈,为4,以便下一次循环使用
		
		mov byte ptr es:[bx+si], ' '
		inc si
		
		;进行除法操作算出人均收入
		mov ax, es:[bx + 05h]
		mov dx, es:[bx + 07h]
		div word ptr es:[bx + 0ah] ;总收入/雇员数
		mov es:[bx + si], ax       ;将结果送到table区
		
		add si, 2
		mov byte ptr es:[bx+si], ' '
	
	add bx, 10h          ;将bx+10h,进行下一行的写入
	pop cx				;将外层循环次数出栈
	loop outter
	
	mov ax, 4c00h
	int 21h
	
	
codesg ends
end start

可以复制粘贴到编辑器里查看具体内容

1,思路逻辑要清晰,如何使用内外循环
2,在每次内循环中如何使用变量将db, dd, dw区依次赋值到table 区
3,理解db, dd, dw之间的间距和每次递增大小

结果如下

实验7
仔细对比可以发现,db, dd, dw数据都已写入到table区段

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值