搞懂這個題目的意思就花了我半天,只怪本人理解能力太差。
題目意思:題目定義了21個'year summ ne ?? 『,正好是16個位元組,與table中的相對應。首先我還納悶,1995放到4個位元組中還好說,可是5937000如何放到4個位元組中呢?5a9786h要如何放到4個位元組中呢?原來是這樣,00 5a 97 86,恍然大悟,都怪自己一直對啥bit,byte,字,位元組等等搞不清楚。然後我又以為要跟書上的表一模一樣,百思不得其解,難道我現在的水平還能做出這麼高超的表來嗎?第二天再看這個題目,突然一下明白過來,原來db 21 dup('year summ ne ?? ')只是開闢了21個16位元組的空間,然後將之前定義的種種mov或找個棧做中介push進去就ok了。啊,原來如此。分析的時候大家可以畫乙個長條圖,分成乙個乙個小塊,就像位址圖那樣,每個小塊中寫上幾個象徵性的數字,譬如1975.。。。。。。10000000.。。。。0300.。。。,然後可能會更加明白些吧,我這裡就不傳了,csdn不知道發什麼瘋,審核n久。宣告一下,那個1975並不是真的存在記憶體中就是那樣的數字,我是為了方便才那樣寫。
為便於理解,大家可以去這裡看下結果圖:http://download.csdn.net/source/2011848
我也不想這麼麻煩,可是csdn不可以傳了。
第一種方法:mov(我自己寫的哈)
assume cs:codesg,ds:data
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995' ;每個年份佔4個位元組,一共4*21=54h個位元組
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;每個收入佔4個位元組,dd嘛,一共4*21=54h
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800 ;每個雇員數占2個位元組,dw嘛,一共2*21=2ah
data ends
table segment
db 21 dup('year summ ne ?? ') ;16個位元組一排,如果你用命令d檢視時,會發現有一排一排的year summ ne ??,本程式執行完後就會變成(舉乙個例子)類似這樣:1995 h-z- -e m- ,看左邊就會發現時這樣的:31 39 39 35 20 68 97 5a-00 20 88 45 20 4d 01 20 其中31 39 39 35就是1990,20是空格,005a9768就是593700的16進製制了,後面的自己推吧
table ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
s:mov ax,ds:[di]
mov es:[bx],ax
mov ax,ds:[di][2]
mov es:[bx][2],ax
mov ax,ds:[di+54h]
mov es:[bx].5,ax
mov ax,ds:[di+54h][2]
mov es:[bx].5[2],ax
mov ax,ds:[si+0a8h]
mov es:[bx].10,ax
mov dx,[di+54h][2]
mov ax,[di+54h]
div word ptr ds:[si+0a8h]
mov es:[bx].13,ax
add bx,16
add di,4
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
第二種方法:棧
datas segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
db '1991', '1992', '1993', '1994', '1995'
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 118300, 184300, 2759000, 3753000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
datas ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stacks segment
db 16 dup (0)
stacks ends
assume cs:codes,ds:datas,ss:stacks
codes segment
start:
;相關暫存器初始化
mov ax,datas
mov ds,ax
mov ax,table
mov es,ax
mov ax,stacks
mov ss,ax
mov sp,16
mov bx,0
mov bp,0
mov di,0
mov si,0
mov cx,21
cycle: ;使用棧複製年份
push [di].0
push [di].2
pop es:[bp].2
pop es:[bp].0
;使用棧複製收入
push 54h.[di].0
push 54h.[di].2
pop es:[bp].7
pop es:[bp].5
;使用棧複製雇員數
push 0a8h.[si]
pop es:[bp].0ah
;計算人均收入
mov ax,es:[bp].5
mov dx,es:[bp].7
div word ptr es:[bp].0ah
mov es:[bp].0dh,ax
add si,2h
add di,4h
add bp,10h
loop cycle
mov ah,4ch
int 21h
codes ends
end start
王爽實驗14
實驗本身並不難,但是值得有兩個點我出現了錯誤 獲取格式為年 月 日 時 分 秒 assume cs code,ds data data segment db 00 00 00 00 00 00 data ends code segment start mov ax,data mov ds,ax mo...
王爽 組合語言 實驗7
assume cs codesg,ds data ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 db 1983 1984 1985 1986 1987 1988 1989 1990 db 1991 1992 1993...
王爽《組合語言》實驗7
因為實驗7中的資料太多,我就對其縮減了一些。因為其中用到很多的暫存器,但是每個暫存器都有限制規則,所以要精心分配暫存器。最先分配的是兩個段暫存器,data用ds存放,table用es存放。然後要確定迴圈使用的暫存器cx 乙個指向table位址的暫存器bp,乙個指向年份和收入的暫存器di,乙個指向雇員...