鱼C论坛

 找回密码
 立即注册
查看: 3199|回复: 12

大家来围观下,看看我写的程序怎么样····

[复制链接]
发表于 2011-12-3 20:52:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 754774889 于 2011-12-3 21:57 编辑

assume cs:code
a segment
     db 1,2,3,4,5,6,7,8
a ends
b segment
     db 1,2,3,4,5,6,7,8
b ends
stack segment
     db 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,a
     mov ds,ax
         mov ax,b
         mov es,ax
         mov ax,stack
         mov ss,ax
         mov sp,16
         mov bx,0
         mov cx,8
s:   mov al,ds:[bx]
     add al,es:[bx]
     mov ah,0
     push ax
         inc bx
         loop s
         mov ax,4c00h
         int 21h
code ends
end start
         

上面是在做第六章实验五   写的程序,大家看看对不对?我感觉是对的,可是在运行到SP=4的时候就会出错,我实在是不知道错在哪里啦,所以希望哪位高手帮小弟看下究竟我是错在哪啦!小弟,在这就先谢过了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-3 21:48:15 From FishC Mobile | 显示全部楼层

回帖奖励 +1 鱼币

很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题来了,你push一次SP就减二,你定义的栈只够搞四次的!
还有push AX之前把ah清零! 一般我们都是在数据段定义数据这样不乱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-3 21:58:21 | 显示全部楼层

可是我这样改了还是不行啊!高手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-3 22:01:48 | 显示全部楼层
h18755 发表于 2011-12-3 21:48
很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题 ...

还有8个字节单元,栈顶sp=8好像没有错啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-3 22:21:33 From FishC Mobile | 显示全部楼层
754774889 发表于 2011-12-3 22:01
还有8个字节单元,栈顶sp=8好像没有错啊!

时间太长了,都忘了,我给你从写一段吧!
assume cs:code,ds:data,ss:stack
data segment
db 1,2,3,4,5,6,7,8
db 1,2,3,4,5,6,7,8
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:    mov ax,data
mov ds,ax
mov bx,0
mov ax,stack
mov ss,ax
mov sp,16
mov cx,8
mov ax,0
s: add al,[bx]
   add al,[bx+8]
   inc bx
    push ax
loop s
mov ax,4c00h
     int 21
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-3 22:39:00 | 显示全部楼层

回帖奖励 +1 鱼币

你定义的stack段db了8个,而你sp却指向16?求解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-3 22:50:41 From FishC Mobile | 显示全部楼层
zzmatrix 发表于 2011-12-3 22:39
你定义的stack段db了8个,而你sp却指向16?求解

你对栈没搞明白!
第一想跟栈打交道必须每次push 一个字的数据 sp每次都减2
你push八次 那需要SP减多少呢? 是不是十六? dw的意思是定义了八个字型数据,也就是说够你打八次飞机的,你要db也行,必须后面再加八个零,因为栈进栈出都是两个两个的,你开始申请的只是八个字节也就是四个字,而栈每次必须push字或pop 字 你还小等你长大就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-3 23:12:02 | 显示全部楼层
h18755 发表于 2011-12-3 22:21
时间太长了,都忘了,我给你从写一段吧!
assume cs:code,ds:data,ss:stack
data segment

我运行了你写的程序,可是还是提示和我那个程序一样的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-3 23:14:04 | 显示全部楼层
zzmatrix 发表于 2011-12-3 22:39
你定义的stack段db了8个,而你sp却指向16?求解

0-7个字节是栈空间,栈顶指向就是8,其实我也不知道,不改也错,改了还是错。郁闷啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-3 23:29:45 | 显示全部楼层
h18755 发表于 2011-12-3 22:50
你对栈没搞明白!
第一想跟栈打交道必须每次push 一个字的数据 sp每次都减2
你push八次 那需要SP减多少 ...

我只能说,呵呵,你回错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-4 11:40:25 | 显示全部楼层
楼主你看下我的,

assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
stack segment
dw 8 dup (0)
stack ends

code segment
start:  mov ax, stack
         mov ss, ax
         mov sp, 16    ; 因为定义了8个字型栈空间,所以0-15, 指针加1
         mov ax, a
         mov ds, ax
         mov ax, b
         mov es, ax
         
         mov ax, 0
         mov bx, 0
         mov cx, 8    ; 要相加8次
     
s:      mov ax, ds:[bx]
        add ax, es:[bx]
        push ax
        inc bx
        loop

       mov ax, 4c00h
       int 21h

code ends
end start

本人纯手打的    我也是零基础学习汇编,是菜鸟,有什么错误的地方,请大大们指出来,  本人的原则是,不怕出错,就怕不出错,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-4 13:20:27 | 显示全部楼层
我没看懂啊,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-4 13:21:03 | 显示全部楼层
楼主加油哦,继续努力!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 19:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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