這個題目做了很久,使用了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...