关于递归中堆栈的问题???

swimmer2000 2002-11-28 01:08:31
程序如下:
data_seg segment
n_v dw ?
result dw ?
data_seg ends
stack_seg segment
dw 128 dup(0)
tos label word
stack_seg ends
code1 segment
main proc far
assum cs:code1,ds:data_seg,ss:stack_seg
start:
mov ax,stack_seg
mov ss,ax
mov sp,offset tos
push ds
sub ax,ax
push ax
mov ax,data_seg
mov ds,ax
mov bx,offset result
push bx
mov bx,n_v
push bx
call far ptr fact
.
.
.
ret
main endp
code1 ends
code segment
frame struc
save_bp dw ?
save_cs_ip dw 2 dup(?)
n dw ?
result_addr dw ?
frame ends
assume cs:code
fact proc far
push bp
mov bp,sp
push bx
push ax
mov bx,[bp].result_addr
mov ax,[bp].n
cmp ax,0
je done
push bx ;可不可以不要这句,这句的作用是什么?
dec ax
push ax
call far ptr fact
mov bx,[bp].result_addr
mov ax,[bx]
mul [bp].n
jmp short return
done: mov ax,1
return: mov [bx],ax
pop ax
pop bx
pop bp
ret 4;此处为什么要加4,这4个单元是什么东西占用了?
fact endp
code ends
end start
小弟对汇编很感兴趣,但感到很迷茫,急需高手指教,qq:49490255 . 谢谢!
...全文
68 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
clumsy 2002-12-21
  • 打赏
  • 举报
回复
tos应该是top of stack的意思, 但由于栈是由高地址向低地址方向行进的, 所以是在栈存储空间的高地址处.

要不出 no stack segment 的警告提示, 堆栈段的声明应写为
stack_seg segment STACK ; 加上 STACK 的类型声明
swimmer2000 2002-12-20
  • 打赏
  • 举报
回复
书上没有讲tos,我个人认为是type of stackpointor 缩写,不知是否正确?怎样才能让电脑不出现no stack segment
giantzz 2002-11-29
  • 打赏
  • 举报
回复
书上有这些问题的,多看看书吧
ocoogo 2002-11-28
  • 打赏
  • 举报
回复
no stack segemtn 只是说没定义专门堆栈段,在你的程序中,堆栈段实际上在data segment 中,所以不用操心。。。多看看书吧。。tos lable word意思是定一个标号 但不分配存储空间!!!
ocoogo 2002-11-28
  • 打赏
  • 举报
回复
不是给你说得很清楚么!!cs ip虽然要进堆栈,但cpu会自动弹出,程序不用操心!!

看这句:
因为你是通过堆栈传递参数,所以在调用call前执行了两句push xxxx
因此sp:=sp-4 所以在退出 fact过程时,你需要sp:=sp+4 为了保持堆栈平衡
swimmer2000 2002-11-28
  • 打赏
  • 举报
回复
tos label word 什么意思?还有masm5.0怎么说no stack segment?
swimmer2000 2002-11-28
  • 打赏
  • 举报
回复
to ocoogo(殴酷哥) 是不是在调用前cs ip要进栈,故加4?
ocoogo 2002-11-28
  • 打赏
  • 举报
回复
>push bx ;可不可以不要这句,这句的作用是什么?
不能不要,fact过程,需要两个参数 1.结算结果保存地址 2.需要计算阶乘的数
push bx 就是把 1.结算结果保存地址入堆!

ret 4;此处为什么要加4,这4个单元是什么东西占用了?
因为你是通过堆栈传递参数,所以在调用call前执行了两句push xxxx
因此sp:=sp-4 所以在退出 fact过程时,你需要sp:=sp+4 为了保持堆栈平衡

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧