实验7,无法理解,谁能告诉我哪儿错了
本帖最后由 740641642 于 2018-8-22 21:23 编辑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'
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
codesg segment
start:mov ax,data
mov ds,ax
mov bx,0
mov ax,table
mov ss,ax
mov bp,0
mov si,0
mov cx,21
S:mov ax,
mov ,ax
mov ax,
mov ,ax
mov ax,
mov ,ax
mov ax,
mov ,ax
mov ax,
mov ,ax
mov ax,
mov ,ax
mov ax,
mov ax,
div word ptr
mov ,ax
add bp,10h
mov si,2
add bx,2
loop S
mov ax,4c00h
int 21h
codesg ends
end start
前两行是对的后面就乱了
大哥们 我卡这里很久了 1 2
ss指向table,sp指向哪里?
你的堆栈段在哪?
本帖最后由 740641642 于 2018-8-23 03:25 编辑
人造人 发表于 2018-8-22 22:22
ss指向table,sp指向哪里?
你的堆栈段在哪?
我没用栈段的我是把SS和bp 用在一起的相当于 ds和bx的运用 你仔细看一下,前两行的数据也不对
1. S:mov ax,
mov ,ax ;你这里 应该是mov ss:,ax应明确指出放到哪个段
mov ax,
mov ,ax
2. mov ax,table
mov ss,ax ;你有es段寄存器不用,弄个栈段寄存器 ss 当数据段寄存器用
你这代码自己重新捋一下 codesg segment
start: mov ax,datasg ;原数据段
mov ds,ax
mov ax,table ;表格数据段
mov es,ax
mov bx,0
mov bp,0
mov cx,21 ;循环次数
mov si,0
mov di,0
s: mov bp,0
add bp,si
mov ax,ds: ;年份
mov es:,ax
mov ax,ds:
mov es:,ax
mov bp,0
add bp,84 ;21*4=84 向后加84个字节的偏移是收入数据的字段
add bp,si
mov ax,ds: ;收入
mov es:,ax
mov ax,ds:
mov es:,ax
add si,4
mov bp,0
mov bp,168 ; 向后加168个字节的偏移是人员数据的字段
mov ax,ds: ;人员数
mov es:,ax
add di,2
mov ax,es: ;人均收入
mov dx,es:
div word ptr es:
mov es:,ax
add bx,10h
loop s
mov ax,4c00h
int 21h
codesg ends
end start 本帖最后由 740641642 于 2018-8-23 15:28 编辑
wuyantao 发表于 2018-8-23 05:54
你仔细看一下,前两行的数据也不对
1. S:mov ax,
mov ,ax ;你 ...
你看一下第8章第一篇的内容我这样是可以的 bp是做为ss的偏移地址
而且不用es 可以少写几个代码 mov ax,
mov ,ax
mov ax, ;你这里不对,这行代码是多余的,雇员人数是word型,你传了个dword,你看
mov ,ax 一下表格 0ch 是什么位置
mov si,2 ;这两行不对,逻辑有点问题
add bx,2
另外,我确实忘记了 bp 的默认段寄存器是 ss ,确实省了几行化码 assume cs:codesg,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,800,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 11542,14430,15257,17800
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 bx,0
mov si,0
mov di,0a8h
mov cx,21
s: mov ax,
mov es:,ax
mov ax,
mov es:,ax
mov al,
mov es:,ax
mov dx,
mov es:,dx
mov bp,
mov es:,bp
div word ptr bp
mov es:,al
add bx,16
add si,4
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
正确的代码,你喜欢用SS就把我的ES换成SS就行,但用SS的话就不能单步调试 wuyantao 发表于 2018-8-23 21:34
mov ax,
mov ,ax
mov ax, ;你这里不对,这行代码是多余的,雇员人数是word型,你传了个dword, ...
啊 我终于发现问题 被你点醒了 确实多余了
add si,2
add bx,2 而且确实是这里出错了
前两次循环是对的 第三次循环就乱了原因出在这
感谢感谢 57158597@qq.com 发表于 2018-8-26 10:17
assume cs:codesg,ds:data,es:table
data segment
thank~
页:
[1]