汇编语言王爽试验7问题,希望指点,谢谢
不知道怎么出现这种情况,19.........3,这段怎么没有了,代码在下面,希望各位指正,谢谢assume cs:codesg,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'
;以上是表示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 11452,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
stack segment
db 16 dup (0)
stack 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 sp,10H
mov ax,stack
mov ss,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
S: ;21年的年份
mov dx,ds:
mov es:,dx
mov dx,ds:
mov es:,dx
;21年的收
mov dx,ds:
mov es:,dx
mov dx,ds:
mov es:,dx
;21年的人数
mov dx,ds:
mov es:,dx
add si,4 ;表示年份双字和公司收入双字循环
add di,16 ;表示换行循环
add bx,2 ;表示雇员数循环
Loop S
mov bx,0
mov si,0
mov di,0
mov cx,21
S0: ;平均收入
mov ax,
mov dx,
div word ptr
mov es:,ax
add di,4
add si,2
add bx,16
loop S0
mov ax,4c00h
int 21H
codesg ends
end start
问题出在 栈段吧 栈段删除就好了~~ 原因自己分析一下吧~太累了不分析了~! 谢谢问题确出在栈段,设那个栈本来是想是多重循环放cx值的,感觉麻烦没用,谢谢指点,但还是不知道为什么去掉栈段就可以了。不过还是多谢了,我自己再单步一下看看怎么回事 变一下顺序就好了 mov ax,stackmov ss,ax mov sp ,10H mov ax tablemov es,ax 要定义的顺利来啊 哥们 我试了,先定义SS,再定义sp在DEBUG里定义sp那部分不执行,所以才先定义的sp。 我都调试完了 肯定是栈的 问题 的 要不就 删掉 要不就 把她定义到 TABLE 段后面 要就 就 该一下程序~~肯定没毛病 自己亲自调试了 半个小时~你自己改改看吧~! 把 ES 取址 放找 栈取址 后面 就行了 恩,我也试了,确定是栈的问题,mov ax,stack
mov ss,ax
mov sp,10h
不知道为什么在debug里面执行完mov ss,ax不执行mov sp,10h了,直接跳到下面了,但先定义mov sp,10h可以 这个问题真没必要太深究~~浪费时间~! 以后你也不会用到DOS下的 也就是 实模式下的 汇编~!看的懂就好了~别把大量的时间花在他身上~~重点是 WIN32汇编 到是不说有研究精神不好~~太浪费时间就不是好事了~! 恩,好的,谢谢,我是从C++开始学的,但以前不懂汇编上的东西,在C++上有些东西不好理解,
现在继续往下看 这个 就是这样的~~SP + 10 这个关系到 CPU中断的问题~!他不是没执行是 一起执行了2条命令 你看SP就知道了~! 恩,好的,我继续往下看 因为中断 的时候要 用到 push cs push ip 的指令~~ 中断还不一定什么时候发生~CPU为了防止 栈SP 不正确~才吧 2条指令一起执行~~不允许 指令中间有中断~明白了吧 先SS 在SP 才是正确的做法~!SS 一定要和SP 挨着 良好的习惯
页:
[1]