汇编语言随笔(7)-访问内存的寻址方式和实验7
程序员文章站
2024-02-02 15:46:04
...
寻址方式小结:
寻址方式 | 含义 | 名称 | 常用格式示例 |
---|---|---|---|
[idata] | EA=idata,SA=(ds) | 直接寻址 | [idata] |
[bx],[si],[di] | EA=(bx)或(si)或(di),SA=(ds) | 寄存器间接寻址 | [bx] |
[bp] | EA=(bp),SA=(ss) | 寄存器间接寻址 | [bp] |
[bx+idata],[si+idata],[di+idata] | EA=(bx)+idata或(si)+idata或(di)+idata,SA=(ds) | 寄存器相对寻址 | [bx+10] |
[bp+idata] | EA=(bp)+idata,SA=(ss) | 寄存器相对寻址 | [bp+10] |
[bx+si],[bx+di] | EA=(bx)+(si)或(bx)+(di),SA=(ds) | 基址变址寻址 | [bx+si] |
[bp+si],[bp+di] | EA=(bp)+(si)或(bp)+(di),SA=(ss) | 基址变址寻址 | [bp+si] |
[bx+si+idata],[bx+di+idata] | EA=(bx)+(si)+idata或(bx)+(di)+idata,SA=(ds) | 相对基址变址寻址 | [bx+si+10] |
[bp+si+idata],[bp+di+idata] | EA=(bp)+(si)+idata或(bp)+(di)+idata,SA=(ss) | 相对基址变址寻址 | [bp+si+10] |
关于处理数据的长度
1,通过寄存器来指明要处理数据的尺寸。如mov ax,[bx]和mov al,[bx]分别针对的是内存中的字节单元和字型数据。
2,在没有寄存器的情况下,可以用 数据长度 ptr 的格式来指明,其中数据长度可以为byte或word,分别表示字节和字。如下面几种操作表示操作的是字型数据:
mov word ptr ds:[0],1 可将数据直接传送到字型内存单元。
inc word ptr ds:[0]
add word ptr [bx],1
对字节单元的数据采用 byte ptr。
3,在push和pop中不需要指明内存单元的长度,因为只能是字型数据。如:push ds:[0]
实验7
将data段中21年的数据按照填入table表中,其中人均收入需要计算。table表一共21行,每一行共计16字节,格式如下:
年份(4字节) | 空格 | 收入(4字节) | 空格 | 雇员数(4字节) | 空格 | 人均收入(2字节) | 空格 |
---|
程序如下:
assume cs:code
data segament
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个字符串来表示年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 245980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
//用21个双字型数据来表示公司每年的总收入
dw 3,7,9,13,28,38,130,220,476,778,100,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
//用21个字型数据来表示公司每年的员工数量
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
code segment
start:mov ax,data
mov ds,ax 用ds来存放数据段的段地址
mov ax,table
mov es,ax 用es来存放table段的段地址
mov di,0 di保存table中每一行的初始地址
mov bx,0 bx表示数据段起始的偏移地址。
mov al,21
mov dl,8
mul dl
mov si,ax 计算21*8的字节数,保存到si中,这是雇员数在数据段的起始偏移地址
mov cx,21 外层循环次数21次
s: mov ax,[bx]
mov es:[di],ax
mov ax,[bx+2]
mov es:[di+2],ax
mov ax,[bx+84] bx+84为总收入的偏移地址
mov es:[di+5],ax
mov ax,[bx+86]
mov es:[di+7],ax
mov ax,[si]
mov es:[di+10],ax
mov dx,[bx+86]
mov ax,[bx+84]
div word ptr [si] 计算人均收入
mov es:[di+13],ax
add di,10h
add si,2
add bx,4
loop s
mov ax,4c00h
int 21h
code ends
end start
注明:空格已经在table段给出,故没必要在程序在设置空格符了。关于用ax作为周转寄存器执行从内存到内存的数据传送,建议可以用栈来代替。关于乘除法的运算规则可以参考https://blog.csdn.net/Little_ant_/article/details/108149575
上一篇: [汇编语言]实验:更灵活的寻址方式 -应用si和di
下一篇: 汇编语言基础