754774889 发表于 2011-12-3 20:52:19

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

本帖最后由 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:
   add al,es:
   mov ah,0
   push ax
         inc bx
         loop s
         mov ax,4c00h
         int 21h
code ends
end start
         

上面是在做第六章实验五   写的程序,大家看看对不对?我感觉是对的,可是在运行到SP=4的时候就会出错,我实在是不知道错在哪里啦,所以希望哪位高手帮小弟看下究竟我是错在哪啦!小弟,在这就先谢过了。。。

h18755 发表于 2011-12-3 21:48:15

很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题来了,你push一次SP就减二,你定义的栈只够搞四次的!
还有push AX之前把ah清零! 一般我们都是在数据段定义数据这样不乱

754774889 发表于 2011-12-3 21:58:21

h18755 发表于 2011-12-3 21:48 static/image/common/back.gif
很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题 ...

可是我这样改了还是不行啊!高手

754774889 发表于 2011-12-3 22:01:48

h18755 发表于 2011-12-3 21:48 static/image/common/back.gif
很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题 ...

还有8个字节单元,栈顶sp=8好像没有错啊!

h18755 发表于 2011-12-3 22:21:33

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,
   add al,
   inc bx
    push ax
loop s
mov ax,4c00h
   int 21
code ends
end start

zzmatrix 发表于 2011-12-3 22:39:00

你定义的stack段db了8个,而你sp却指向16?求解

h18755 发表于 2011-12-3 22:50:41

zzmatrix 发表于 2011-12-3 22:39
你定义的stack段db了8个,而你sp却指向16?求解

你对栈没搞明白!
第一想跟栈打交道必须每次push 一个字的数据 sp每次都减2
你push八次 那需要SP减多少呢? 是不是十六? dw的意思是定义了八个字型数据,也就是说够你打八次飞机的,你要db也行,必须后面再加八个零,因为栈进栈出都是两个两个的,你开始申请的只是八个字节也就是四个字,而栈每次必须push字或pop 字 你还小等你长大就明白了

754774889 发表于 2011-12-3 23:12:02

h18755 发表于 2011-12-3 22:21 static/image/common/back.gif
时间太长了,都忘了,我给你从写一段吧!
assume cs:code,ds:data,ss:stack
data segment


我运行了你写的程序,可是还是提示和我那个程序一样的错误

754774889 发表于 2011-12-3 23:14:04

zzmatrix 发表于 2011-12-3 22:39 static/image/common/back.gif
你定义的stack段db了8个,而你sp却指向16?求解

0-7个字节是栈空间,栈顶指向就是8,其实我也不知道,不改也错,改了还是错。郁闷啊

zzmatrix 发表于 2011-12-3 23:29:45

h18755 发表于 2011-12-3 22:50 static/image/common/back.gif
你对栈没搞明白!
第一想跟栈打交道必须每次push 一个字的数据 sp每次都减2
你push八次 那需要SP减多少 ...

我只能说,呵呵,你回错了

100531319 发表于 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:
      add ax, es:
      push ax
      inc bx
      loop

       mov ax, 4c00h
       int 21h

code ends
end start

本人纯手打的{:5_109:}    我也是零基础学习汇编,是菜鸟,有什么错误的地方,请大大们指出来,{:5_109:}本人的原则是,不怕出错,就怕不出错,{:5_97:}

秋晓枫‰ 发表于 2011-12-4 13:20:27

我没看懂啊,

秋晓枫‰ 发表于 2011-12-4 13:21:03

楼主加油哦,继续努力!
页: [1]
查看完整版本: 大家来围观下,看看我写的程序怎么样····