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

来源:互联网 发布:网络授课平台哪个好 编辑:程序博客网 时间:2024/05/18 06:20

这个题目做了很久,使用了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遇到无效指令的问题”,百思不得其解。

0 0