大家来围观下,看看我写的程序怎么样····
本帖最后由 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的时候就会出错,我实在是不知道错在哪里啦,所以希望哪位高手帮小弟看下究竟我是错在哪啦!小弟,在这就先谢过了。。。
很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题来了,你push一次SP就减二,你定义的栈只够搞四次的!
还有push AX之前把ah清零! 一般我们都是在数据段定义数据这样不乱 h18755 发表于 2011-12-3 21:48 static/image/common/back.gif
很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题 ...
可是我这样改了还是不行啊!高手 h18755 发表于 2011-12-3 21:48 static/image/common/back.gif
很明显堆栈段不够! 你定义的八个字节的栈段,也就是四个字型数据,而你cx=8也就你你需要push 8次ax 好了问题 ...
还有8个字节单元,栈顶sp=8好像没有错啊! 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 你定义的stack段db了8个,而你sp却指向16?求解 zzmatrix 发表于 2011-12-3 22:39
你定义的stack段db了8个,而你sp却指向16?求解
你对栈没搞明白!
第一想跟栈打交道必须每次push 一个字的数据 sp每次都减2
你push八次 那需要SP减多少呢? 是不是十六? dw的意思是定义了八个字型数据,也就是说够你打八次飞机的,你要db也行,必须后面再加八个零,因为栈进栈出都是两个两个的,你开始申请的只是八个字节也就是四个字,而栈每次必须push字或pop 字 你还小等你长大就明白了 h18755 发表于 2011-12-3 22:21 static/image/common/back.gif
时间太长了,都忘了,我给你从写一段吧!
assume cs:code,ds:data,ss:stack
data segment
我运行了你写的程序,可是还是提示和我那个程序一样的错误 zzmatrix 发表于 2011-12-3 22:39 static/image/common/back.gif
你定义的stack段db了8个,而你sp却指向16?求解
0-7个字节是栈空间,栈顶指向就是8,其实我也不知道,不改也错,改了还是错。郁闷啊 h18755 发表于 2011-12-3 22:50 static/image/common/back.gif
你对栈没搞明白!
第一想跟栈打交道必须每次push 一个字的数据 sp每次都减2
你push八次 那需要SP减多少 ...
我只能说,呵呵,你回错了 楼主你看下我的,
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:}
我没看懂啊, 楼主加油哦,继续努力!
页:
[1]