王爽 實驗7

2021-05-21 14:20:28 字數 4028 閱讀 7832

搞懂這個題目的意思就花了我半天,只怪本人理解能力太差。

題目意思:題目定義了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,乙個指向雇員...