汇编_寻址方式在结构化数据访问中的应用
如何寻址数据
巩固一下寄存器
- 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。
汇编语言中数据位置的表达
- 立即数
对于直接包含在机器指令中的数据,在汇编指令中直接给出。例如,mov ax,1. - 寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如,mov ax,bx. - 段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出EA,SA在某个段寄存器中。例如:mov ax,[0]
寻址方式
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。
指令要处理的数据有多长
- 通过寄存器指明,ax字操作,al字节操作
- X ptr 指明内存单元的长度,X可以为word或byte,mov word ptr [bx],1
- 其他方法,例如: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
总结
这节摘录了很多原书中的内容,大部分都是概念性的知识,记忆即可。实验七的意义,不仅仅在于如何计算结果写到另一块内存中,而是面对一个实际问题,我们要使用什么样的数据结构去存储、表达和运算。程序等于数据结构加算法,我想道理就在于此。