|
主题 : : 实验7 [待解决] |
回复[ 6次 ]
点击[ 310次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-12-14 10:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
assume cs:code
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,46
49000,5937000
;以上是表示21年公司总收的21个dword型数据
dw
3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037
,5635,8226
dw 11542,14430,45257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov ax,table
mov es,ax
mov bx,0
mov bp,0
mov cx,21
s: push cx
push si
mov cx,4
mov si,0
s1: mov al,ds:[bp+si]
mov es:[bx+si],al
inc si
loop s1
pop si
mov ax,ds:[84+bp]
mov dx,ds:[84+bp+2]
mov es:[bx+5],ax
mov es:[bx+7],dx
mov ax,ds:[168+si]
mov es:[bx+0ah],ax
add si,2
add bx,10h
add bp,4
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
这是第一次写的。
记录下来,方便以后对比学习。
这里没有用到栈。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-12-14 12:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
实验七。精华版。别人写的。
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,14430,45257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
mov bx,0
mov si,0
mov di,0
s:mov ax,ds:0[si] ;copy year
mov es:[bx].0,ax
mov ax,ds:0[si+2]
mov es:[bx].0[2],ax
mov ax,ds:84[si] ;copy sum input
mov es:[bx].5,ax
mov dx,ds:84[si+2]
mov es:[bx].5[2],dx
mov ax,ds:168[di] ;copy employee sum
mov es:[bx].10,ax
div word ptr es:10[bx] ; copy average
mov es:[bx].0dh,ax
add si,4
add di,2
add bx,16
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-12-14 12:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
实验七。堆栈版。别人写的。
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
-------------------------------------------------------------------
栈的使用、结构化程序设计的思想... | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-12-14 12:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
|
|
|
|
|
[第4楼]
[ 回复时间:2010-12-14 12:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
|
|
|
|
|
[第5楼]
[ 回复时间:2010-12-14 12:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
|
|
|
|
|
[第6楼]
[ 回复时间:2010-12-14 12:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-05 15:22 |
最后总结一下试验7的思路。
无非是把三个数组传送到结构体中的各个字段。
这三个数组是(当然了,(ds)=data):
年份数组 ds:0[si] ;
收入数组 ds:84[si];
人数数组 ds:168[di];
结构体的字段是(当然了,(es)=table):
年份字段 es:[bx].0[0];
收入字段 es:[bx].5[0];
人数字段 es:[bx].10;
人均字段 es:[bx].0dH;
这个明确了,就好办了。
下面就是对应传送了
年份数组 ->年份字段 ;
ds:0[si]->es:[bx].0[0];
怎么传送。
可以循环四次,一个字节一个字节传送。
有更好的办法吗?有。
就是不循环,分两段传送。
ds:0[si+0]->es:[bx].0[0];
ds:0[si+2]->es:[bx].0[2];
这样有什么好处呢。看下面收入的传送就知道了。
收入数组->收入字段;
ds:84[si]->es:[bx].5[0];
一次传不完。怎么传送?分两段。
ds:84[si+0]->es:[bx].0[0];
ds:0[si+2]->es:[bx].0[2];
再回头看上面。发现什么了吗?
上面两个传送都是分两段传送,这样就不用内嵌循环了。
一个大循环什么都ok了。简单吧。
这里要注意的是,循环中si要不断的加4,就是add si,4。
人数数组 ds:168[di]->人均字段 es:[bx].0dH;
后面的就更简单了。
传送一个字节,一次就可以搞掂了。
为什么这里用di呢。
因为在这里循环的时候,di每次递增的是2,所以不得不用一个寄存器。
就是add di,2
剩下的就不用说了吧。这里都搞掂了,剩下的再不会,就重新看书复习吧。。。
哇哈哈。花了很多时间做和理解这道题。
这里把心得写写,算是一个总结。
也算是下一章的开始。哇哈哈。 | | |
|