实验7的问题 求鱼友解答
本帖最后由 番茄遇蜜桃 于 2014-1-22 02:41 编辑assume cs:codesg,ds:datasg,es:tablesg,ss:stacksg
datasg 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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11452,14430,15257,17800
datasg ends
tablesg segment
db 21 dup ('year summ ne ?? ')
tablesg ends
stacksg segment
dw 0,0,0,0,0,0,0,0;定义一个栈
stacksg ends
codesg segment
start:mov ax,datasg
mov ds,ax ;赋源数据段地址
mov ax,tablesg
mov es,ax ;赋目标段地址
mov ax,stacksg
mov ss,ax
mov sp,10h ;初始化客
mov bx,0
mov si,0
mov di,0
mov bp,0
mov cx,21 ;外循环控制行数
s1: push cx ;保护cx
mov cx,2;写入每行数据
s2: mov ax,;定位第一个年份的低16位(2个字节)
mov es:,ax;将低16位送入制定位置
mov ax, ;定位第一个收入低16位
mov es:,ax ;将低16位送入制定位置
add si,2h ;准备写入高16位
loop s2;写入高16位 ps:年份和收入都是32位(4个字节)所以考虑用2次16位寄存器ax写入指定位置。
mov ax,ds:;定位雇员数 16位(2个字节)
mov es:,ax ;写入指定位置
mov ax, ;准备做除法
mov dx,
div word ptr ds: ;开始做除法,定位除数
mov es:,ax;将除法的商写入指定位置ps:本行数据写入完成
add bx,4h;开始定位下个32位数据(年份和收入)准备下一行数据
add di,2h ;开始定位下个16位数据(雇员数)准备第下一行数据
add bp,10h;目标位置换下一行地址
pop cx;弹出cx值
loop s1;返回写入下一行数据
mov ax,4c00h
int 21h
codesg ends
end start
无法通过编译不知道有什么错误,肯定大家帮我看看。谢谢~~
大致算法如上。
栈定义不正确, 取消栈。 取消内循环结果正常。修改后代码。
assume cs:code,ds:data,es:table
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11452,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov di,0
mov bp,0
mov cx,21
s: mov ax,
mov es:,ax
mov ax,
mov es:,ax
mov ax,
mov es:,ax
mov ax,
mov es:,ax
mov ax,ds:
mov es:,ax
mov ax,
mov dx,
div word ptr ds:
mov es:,ax
add bx,4h
add di,2h
add bp,10h
loop s
mov ax,4c00h
int 21h
code ends
end start 再不改变原来思路的基础上 终于想明白,下面贴出来一切正常源码。
assume cs:code,ds:data,es:table,ss:stack
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11452,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment stack
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bx,0
mov di,0
mov bp,0
mov cx,21
s1: push cx
mov si,0
mov cx,2
s2: mov ax,
mov es:,ax
mov ax,
mov es:,ax
add si,2
loop s2
mov ax,
mov dx,
div word ptr ds:
mov es:,ax
mov ax,ds:
mov es:,ax
add bx,4
add di,2
add bp,16
pop cx
loop s1
mov ax,4c00h
int 21h
code ends
end start 路过看看= =
页:
[1]