用递归倒序输出一个字符串

zk3389 2011-12-28 04:51:17
.model small
.data
string db 'hap$'
.stack 200h
.code
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,@data
mov ds,ax
mov bx,offset string
push bx
call reverse
pop bx
mov dl,[bx]
mov ah,2
int 21h
ret
main endp
;-------------------------
reverse proc near
push ax
push bx
push dx
push bp
mov bp,sp
mov bx,[bp+10]
mov al,[bx]
cmp al,'$'
jne re_call
jmp return
re_call:
inc bx
push bx
call reverse
pop bx
mov dl,[bx]
mov ah,2
int 21h
return:
pop bp
pop dx
pop bx
pop ax
ret
reverse endp
;---------------------------------------
end start
为什么最后一个‘$’也输出来了?


...全文
278 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk3389 2012-01-01
  • 打赏
  • 举报
回复
懂了,我爱你
zara 2011-12-31
  • 打赏
  • 举报
回复
进栈了的。当前字符到 'p' 时,因不是 '$' 故而会去 re_call: 处,inc bx 就指向了 '$' 接着再 call reverse 会因为是 '$' 而返回,下来,就是显示 bx 处的字符,也就是 '$' 了。这样的结果,就是第一个字符反而不能显示了,所以你的 main 里才会有那么个显得多余的显示字符的功能调用。
其实,你 debug 这个程序,将 bx 指向 'p' 单步走一遍就会明白了。
zk3389 2011-12-31
  • 打赏
  • 举报
回复
$的地址并没有进栈啊,所以第一次执行pop bx ,bx指向的地址应该是‘p'才对啊?这是我迷惑的地方,我也觉得main里的显示字符多余了。
zara 2011-12-29
  • 打赏
  • 举报
回复
因为你输出字符,输出的是递归后的下一个字符;可以将 mov dl, [bx] 改为 mov dl, [bx][-1] 试试。
另外,main 里调用了递归函数后再显示个字符做什么呢,多余了吧。

21,453

社区成员

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

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