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

如何寻址数据

巩固一下寄存器

  • reg: ax, bx, cx, dx, ap, bp, si, di
  • sreg: ds, ss, cs, es

bx, si, di, bp

  • 在8086CPU中,只有这4个寄存器可以用在"[...]"中进行内存单元的寻址。
  • 这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
  • 只要在[...]中使用寄存器bp,段地址默认是ss。

汇编语言中数据位置的表达

  1. 立即数
    对于直接包含在机器指令中的数据,在汇编指令中直接给出。例如,mov ax,1.
  2. 寄存器
    指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如,mov ax,bx.
  3. 段地址(SA)和偏移地址(EA)
    指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出EA,SA在某个段寄存器中。例如:mov ax,[0]

寻址方式

当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。

指令要处理的数据有多长

  1. 通过寄存器指明,ax字操作,al字节操作
  2. X ptr 指明内存单元的长度,X可以为word或byte,mov word ptr [bx],1
  3. 其他方法,例如:push只进行字操作

实验七

由于题目给出了数据的存储方式,难度大大降低,只需考虑如何取数即可。
数据是结构化存储的,所以我们可以通过循环来索引数据。
偏移量需要自己计算,遇到不同长度的数据,还需要额外定义一个寄存器(di)来辅助运算。

assume cs:codesg
data segment
    db '1975','1976','1977'             ; 年份 4 * 3 = 12
    dd 16,22,382			; 收入 4 * 3 = 12
    dw 3,7,9 				; 人数 2 * 3 = 6data ends
table segment
    db 3 dup ('year summ ne ?? ') ; 16字节,4+1+4+1+2+1+2+1
table ends
codesg segment
; 一种方法是,四个属性,写四个循环,连续索引赋值,+4/+2
; 另一种方法是,四个属性,一个循环,根据偏移量索引
; 这里使用第二种方式,计算第一年的年份,然后+12,计算这一年的收入
start: 
	mov ax,data
	mov ds,ax
	mov ax,table
	mov es,ax
	mov bx,0
	mov si,0
	mov dx,0
	mov di,0 	;用来索引人数数据
	mov cx,3
	s0:
		mov ax,[bx]		
		mov es:[si],ax
		mov ax, [bx].2
		mov es:[si].2,ax

		mov ax,[bx].12	
		mov es:[si].5,ax
		mov ax, [bx].14
		mov es:[si].7,ax
		
		mov ax,[di].24	
		mov es:[si].10,ax

		mov ax,[bx].12
		mov dx,[bx].14
		div word ptr [di].24
		mov es:[si].13,ax

		add bx,4
		add di,2
		add si,16
		loop s0
  	mov ax,4c00h
  	int 21h
codesg ends
end start

总结

这节摘录了很多原书中的内容,大部分都是概念性的知识,记忆即可。实验七的意义,不仅仅在于如何计算结果写到另一块内存中,而是面对一个实际问题,我们要使用什么样的数据结构去存储、表达和运算。程序等于数据结构加算法,我想道理就在于此。

posted @ 2023-05-04 20:37  柠檬水请加冰  阅读(83)  评论(0编辑  收藏  举报