汇编语言随笔(7)-访问内存的寻址方式和实验7(不同寻址方式的使用)
尋址方式小結:
| [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字節,格式如下:
??????程序如下:
assume cs:codedata segamentdb '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,197514dd 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,8226dw 11542,14430,15257,17800//用21個字型數據來表示公司每年的員工數量data endstable segmentdb 21 dup('year summ ne ?? ')table endscode segmentstart:mov ax,datamov ds,ax 用ds來存放數據段的段地址mov ax,tablemov es,ax 用es來存放table段的段地址mov di,0 di保存table中每一行的初始地址mov bx,0 bx表示數據段起始的偏移地址。mov al,21mov dl,8mul dlmov si,ax 計算21*8的字節數,保存到si中,這是雇員數在數據段的起始偏移地址mov cx,21 外層循環次數21次s: mov ax,[bx]mov es:[di],axmov ax,[bx+2]mov es:[di+2],axmov ax,[bx+84] bx+84為總收入的偏移地址mov es:[di+5],axmov ax,[bx+86]mov es:[di+7],axmov ax,[si]mov es:[di+10],axmov dx,[bx+86]mov ax,[bx+84]div word ptr [si] 計算人均收入mov es:[di+13],axadd di,10hadd si,2add bx,4loop smov ax,4c00hint 21hcode endsend start??????注明:空格已經在table段給出,故沒必要在程序在設置空格符了。關于用ax作為周轉寄存器執行從內存到內存的數據傳送,建議可以用棧來代替。關于乘除法的運算規則可以參考https://blog.csdn.net/Little_ant_/article/details/108149575
總結
以上是生活随笔為你收集整理的汇编语言随笔(7)-访问内存的寻址方式和实验7(不同寻址方式的使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言随笔(6)-大小写转换与实验6(
- 下一篇: 汇编语言随笔(8)-实验9(显示字符串)