題源:王爽《匯編語言》第八章 實驗七
題目要求
匯編易錯點
用mov賦值的時候,操作數左右寫反,本來想寫mov ax,5 卻寫成mov 5,ax
不看字節長度就直接寫入,覆蓋后面數據:比如把ax中的數據寫入以byte形式存儲的連續數據區
一些小技巧
當寄存器、段寄存器不夠用時,將臨時數據存入數據段或棧段中,等需要使用的時候再取出
本題思路
循環嵌套(兩層)
外層大循環控制tablesg段的每一行
內層3個小循環控制分別把年份、收入、雇員數數寫入tablesg段中,3個小循環之后用div除法指令計算人均收入,也寫入tablesg段中
執行過程截圖
debug模式
執行指令之前,內存中初始數據展示:
第一次外循環中,執行完第一個內循環year
第一次外循環中,執行完第二個內循環income
第一次外循環中,執行完第三個內循環income
第一次外循環中,執行完后續除法運算
執行完所有外循環后的結果
執行完畢~
代碼
以下可復制
assume cs:codesg,ds:datasg,ds:tablesg,ss:stacksg
datasg segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';以上是表示21年的21個字符串 21*4=84個字節 地址(十進制)0~83dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;以上是表示21年公司總收入的21個dword型數據 21*4=84個字節 地址(十進制)84~167dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;以上是表示21年公司雇員人數的21個word型數據 21*2=42個字節 地址(十進制)168~209dw 0,84,168;臨時存儲偏移量 210 211 212datasg endstablesg segmentdb 21 dup('year summ ne ?? ')
tablesg endsstacksg segment stackdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;多給了兩個
stacksg endscodesg segment
start: ;ax 臨時;bx 定位tablesg的行;cx 循環次數;dx;ds 存放datasg首地址;si 利用內存空間的取出和存入,逐字節讀取datasg中的:年份\收入\雇員;datasg首地址放進 段寄存器ds 中mov ax,datasgmov ds,ax;tablesg的首地址放進 段寄存器es 中mov ax,tablesgmov es,ax;bx定位tablesg的行mov bx,0;循環21次mov cx,21
line: push cx ;cx值存入棧mov cx,4mov di,0year: mov ax,ds:210 ;從內存中取出simov si,axmov al,ds:[si] ;ds中年份數據放進al中mov es:[bx+di],al ;al數據放進tablesg第bx行di位置inc siinc di ;si指向下一個mov ds:210,si ;si存到內存中loop yearmov di,5 ;4是空格,收入從5開始mov cx,2
income: mov ax,ds:212 ;從內存中取出simov si,axmov ax,ds:[si] ;ds中收入數據放進ax中mov es:[bx+di],ax ;ax數據放進tablesg第bx行di位置inc di ;tablesg偏移inc diinc si ;datasg偏移inc simov ds:212,si ;si存到內存中loop incomemov di,10 ;9是空格,雇員從10開始mov cx,2
people: mov ax,ds:214 ;從內存中取出simov si,axmov al,ds:[si] ;ds中雇員數據放進al中mov es:[bx+di],al ;al數據放進tablesg第bx行di位置inc si ;si指向下一個inc di mov ds:214,si ;si存到內存中loop peopleaver: mov ax,es:[bx+5] ;被除數(收入)4字節=32位,ax存放低16位,從當前行位置5取出mov dx,es:[bx+7] ;dx存放高16位,從當前行位置7取出div word ptr es:[bx+10] ;除數(雇員)16位,從當前行位置10取出,與ax,dx中的被除數相除,商存在ax中mov es:[bx+13],ax ;al商中的商放進當前行位置13處pop cx ;cx的值pop回去add bx,10h ;下一行loop linemov ax,4c00hint 21h
codesg ends
end start
總結
以上是生活随笔為你收集整理的汇编语言 【大练习】寻址方式在结构化访数据访问中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。