您的位置:首页 > 其它

王爽-汇编语言第三版实验7

2017-04-22 15:55 274 查看
这个题目做了很久,使用了2中方法做出了结果,不过目前在单步调试时还有点疑问。

题目:Power idea公司从1975成立一直到1995年的基本情况被定义到了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遇到无效指令的问题”,百思不得其解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编语言 实验七