鱼C论坛

 找回密码
 立即注册
查看: 2046|回复: 13

汇编语言王爽试验7问题,希望指点,谢谢

[复制链接]
发表于 2013-3-29 15:06:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
图片1.jpg 不知道怎么出现这种情况,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:[si]
       mov es:[di],dx
    mov dx,ds:[2+si]  
    mov es:[2+di],dx
    ;21年的收
    mov dx,ds:[54h+si]
    mov es:[di+5],dx
    mov dx,ds:[56h+si]
    mov es:[7+di],dx
    ;21年的人数
    mov dx,ds:[bx+0a8h]
    mov es:[0ah+di],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,[54h+di]
       mov dx,[56h+di]
    div word ptr [si+0a8h]
    mov es:[bx+0dh],ax
    add di,4
    add si,2
    add bx,16
    loop S0   
   
    mov ax,4c00h
    int 21H
   
       codesg ends
end start
图片.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:18:03 | 显示全部楼层
问题出在 栈段吧 栈段删除就好了~~ 原因自己分析一下吧~太累了不分析了~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-29 16:24:44 | 显示全部楼层
谢谢问题确出在栈段,设那个栈本来是想是多重循环放cx值的,感觉麻烦没用,谢谢指点,但还是不知道为什么去掉栈段就可以了。不过还是多谢了,我自己再单步一下看看怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:29:01 | 显示全部楼层
变一下顺序就好了   mov ax,stack  mov ss,ax mov sp ,10H mov ax table  mov es,ax   要定义的顺利来啊 哥们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-29 16:33:53 | 显示全部楼层
我试了,先定义SS,再定义sp在DEBUG里定义sp那部分不执行,所以才先定义的sp。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:37:24 | 显示全部楼层
我都调试完了 肯定是栈的 问题 的 要不就 删掉 要不就 把她定义到 TABLE 段后面 要就 就 该一下程序~~肯定没毛病 自己亲自调试了 半个小时~你自己改改看吧~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:40:19 | 显示全部楼层
把 ES 取址 放找 栈取址 后面 就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-29 16:46:35 | 显示全部楼层
恩,我也试了,确定是栈的问题,mov ax,stack
                                             mov ss,ax
                                             mov sp,10h
不知道为什么在debug里面执行完mov ss,ax不执行mov sp,10h了,直接跳到下面了,但先定义mov sp,10h可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:46:43 | 显示全部楼层
这个问题真没必要太深究~~浪费时间~! 以后你也不会用到DOS下的 也就是 实模式下的 汇编~!看的懂就好了~别把大量的时间花在他身上~~重点是 WIN32汇编    到是不说有研究精神不好~~太浪费时间就不是好事了~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-29 16:50:08 | 显示全部楼层
恩,好的,谢谢,我是从C++开始学的,但以前不懂汇编上的东西,在C++上有些东西不好理解,
现在继续往下看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:51:36 | 显示全部楼层
这个 就是这样的~~SP + 10 这个关系到 CPU中断的问题~!  他不是没执行是 一起执行了2条命令 你看SP就知道了~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-29 16:54:02 | 显示全部楼层
恩,好的,我继续往下看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:56:03 | 显示全部楼层
因为中断 的时候要 用到 push cs push ip 的指令~~ 中断还不一定什么时候发生~CPU为了防止 栈SP 不正确~才吧 2条指令一起执行~~不允许 指令中间有中断~明白了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-29 16:58:14 | 显示全部楼层
先SS 在SP 才是正确的做法~!  SS 一定要和SP 挨着 良好的习惯   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 22:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表