|
主题 : : 实验7,请求改进 [待解决] |
回复[ 1次 ]
点击[ 297次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2012-11-22 23:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-11-13 22:06 |
用了一天时间才调试出来,用了两种方法做。发现自己的基础不扎实,准备再次从第一章学习下。请各位帮忙改进下。
方案一:
assume cs:codesg,ds:data
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,15257,17800
;以上是表示21年公司雇员人数的21个word型数据。
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
dw 8 dup(0)
stack ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov bp,0
; SS:0存放CX,SS:02指向年份偏移地址。
mov ax,0
mov [bp+2],ax
; ss:04指向21年公司总收入
mov ax,54h
mov [bp+4],ax
;ss:06指向21年公司雇员人数
mov ax,0a8h
mov [bp+6],ax
mov bx,0
mov cx,15h
s: mov [bp],cx
;下面语句在第0~3位输入年份(4字节)
mov si,0
mov cx,4
mov bp,ss:[2]
s1: mov al,ds:[bp][si]
mov byte ptr es:[bx][0][si],al
inc si
loop s1
;第4位输入空格,用''不行,会显示error A2047:empty <null> string,不知道是输入0好还是空格好。
;我输入的是空格,ASCII码是20h,方便在内存中看结果。
mov byte ptr es:[bx][4h],' '
;第5~8位输入‘收入’[bx][5h][si]改为[bx].5h[si]出错,显示error A2166:structure field expected
mov si,0
mov bp,ss:[4]
mov ax,ds:[bp][si]
mov word ptr es:[bx][5h][si], ax
add si,2
mov dx,ds:[bp][si]
mov word ptr es:[bx][5h][si], dx
;第9位输入空格
mov byte ptr es:[bx][9h],' '
;第10~11位输入雇员数。
mov bp,ss:[6]
mov cx,ds:[bp]
mov word ptr es:[bx][0ah],cx
;第12位输入空格
mov byte ptr es:[bx][0ch],' '
;第13~14输入人均收入
div cx
mov word ptr es:[bx][0dh],ax
;第15位输入空格
mov byte ptr es:[bx][0fh],' '
add bx,10h
mov bp,0
mov cx,[bp]
mov ax,04h
;指向下一年份
add [bp+2],ax
;指向下一收入
add [bp+4],ax
;指向下一个雇员数
mov ax,02h
add [bp+6],ax
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2012-11-22 23:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-11-13 22:06 |
方案二:
assume cs:codesg,ds:data
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,15257,17800
;以上是表示21年公司雇员人数的21个word型数据。
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
db 32 dup(0)
stack ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,20h
mov bx,0
mov si,0
mov di,0
mov cx,15h
s: push cx
push ds:[si][0a8h]
push ds:[di][56h]
push ds:[di][54h]
push ds:[di][2]
push ds:[di][0]
add si,2
add di,4
;0~3位输入年份
pop es:[bx][0]
pop es:[bx][2]
;第4位输入空格
mov cx,' '
mov es:[bx][4],cx
;第5~8位输入总收入
pop ax
mov es:[bx][5],ax
pop dx
mov es:[bx][7],dx
;第9位输入空格
mov es:[bx][9],cx
;第10~11列输入雇员数
pop es:[bx][0ah]
;第12列输入空格
mov es:[bx][0ch],cx
;第13~14列输入人均收入
mov cx,es:[bx][0ah]
div cx
mov es:[bx][0dh],ax
;第15列输入空格
mov ax,' '
mov es:[bx][0fh],ax
add bx,10h
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|