王爽 組合語言第三版實驗7

2021-07-30 23:43:33 字數 4357 閱讀 1645

這個題目做了很久,使用了2中方法做出了結果,不過目前在單步除錯時還有點疑問。

題目:power idea公司從1975成立一直到2023年的基本情況被定義到了datasg中,程式設計將datasg段中的資料寫入到table段中,並計算21年中的人均收入(取整),結果儲存到table段中

兩種方法我都使用到了棧, 因為在雙重迴圈中,需要儲存外層迴圈的迴圈次數。

方法一:

先複製21年年分, 然後複製21年營業額,接著複製21年的員工數量,最後計算平均工資。

assume cs:codesg

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'

; 以上是表示21年的21個字串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

; 以上是表示21年公司總收入的21個dword型資料

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw 11542,11430,15257,17800

; 以上是表示21年公司雇員人數的21個word型資料

data ends

table segment

db 21 dup('year summ ne ?? ')

table ends

stack segment

dw 0, 0

stack ends

codesg segment

start:

mov ax, data

mov ds, ax ;init datasegment

mov ax, stack

mov ss, ax

mov sp, 4;init stack

mov ax, table

mov es, ax ;store result

;cp year

mov bx, 0 ;line

mov si, 0

mov cx, 21

c1:;21 year

push cx

mov di, 0

mov cx, 4

c2: ;cp year

mov al, ds:[si]

mov es:[bx + di], al

inc si

inc di

loop c2

pop cx

add bx, 10h

loop c1

;cp summ 

mov si, 0

mov bx, 0

mov cx, 21

c3:push ds:84[si];summ start addr

pop es:[bx].5

push ds:86[si]

pop es:[bx].7

add si, 4

add bx, 10h

loop c3

;cp ne

mov si, 0

mov bx, 0

mov cx, 21

c4:push ds:168[si];summ start addr 168

pop es:[bx].10

add bx, 10h

add si, 2

loop c4 

;mov bx, 0

mov cx, 21

c5: mov ax, es:[bx].5

mov dx, es:[bx].7

div word ptr es:[bx].10

mov es:[bx].13, ax

add bx, 10h

loop c5

mov ax, 4c00h

int 21h

codesg ends

end start

方法二:

這種方法把結果當成乙個結構體陣列,每次迴圈都完成乙個結構體的賦值,更加簡潔。

;1. 資料組織 data 中資料當成陣列,table中資料當成結構體。

;2. data 用si來定址, table 用 bx , di, idata來定址

assume cs:codesg , ss:stacksg

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'

; 以上是表示21年的21個字串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

; 以上是表示21年公司總收入的21個dword型資料

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw 11542,11430,15257,17800

; 以上是表示21年公司雇員人數的21個word型資料

data ends

table segment

db 21 dup ('year summ ne ?? ')

table ends

stacksg segment

dw 8 dup(0)

stacksg ends

codesg segment

start:

mov ax, data

mov ds, ax ;init datasegment

mov ax, table

mov es, ax ;store result

mov ax, stacksg

mov ss, ax ;init stack

mov sp, 16

mov si, 0 ; for data index

mov bx, 0 ; for table line

mov bp, 0 ; for table.ne index

mov cx, 21 ; loop 21 times

c1: push cx ; store cx

mov di, 0 ; for table row

mov cx, 4 ; loop 4 times for year

c2:mov al, [si]

mov es:[bx][di], al

inc si

inc di

loop c2 ; cp year

mov di, 0

mov cx, 4

c3:mov al, 80[si]; sume start at [84],si== 4,80 = 84-4

mov es:[bx].5[di], al

inc si

inc di

loop c3 ; cp sume

mov di, 0

mov cx, 2

c4: mov al, ds:168[bp]; ne start at 168

mov es:[bx].10[di], al

inc di

inc bp

loop c4 ; cp ne

mov ax, es:[bx].5

mov dx, es:[bx].7

div word ptr es:[bx].10

mov es:[bx].13, ax; 計算人均收入

pop cx ; restore cx

add bx, 10h ; bx->next line

sub si, 4 ; adjust si to --->next year

loop c1

mov ax, 4c00h

int 21h

codesg ends

end start

不知道什麼原因,加了上述紅色部分**(設定棧頂),在單步除錯時就會出現提示「 cpu遇到無效指令的問題」,百思不得其解。

《組合語言》王爽第三版 實驗9

datas segment 此處輸入資料段 db w 00000010b,e 00000010b,l 00000010b,c 00000010b,o 00000010b db m 00000010b,e 00000010b,0,t 00100100b,o 00100100b,0 db m 01110...

《組合語言(第三版)》王爽,實驗九

不知道為什麼,在win7下用的emu8086,顯示會錯位,到不了中間位置 在網上找了下別人的 發現即使是在別人那裡能正常顯示在中間位置,複製到我這裡都會顯示為上圖所示的樣子。下面是 定義資料段的時候為了後面不用將ascii碼和屬性分開讀取,就定義成如下這樣比較繁瑣的形式了。其實做的時候第一時間沒想到...

王爽《組合語言(第三版)》 實驗七

萌新學彙編 邊學邊練 以下是實驗七的練手 assume cs codesg,ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1991...