Win32汇编(SMU—递归子程序)

塔

运行后若输入:		运行后若输入:         
1					3
则结果输出:			则结果输出:
A1个盘到C			A1个盘到C
					A1个盘到B
运行后若输入:		C1个盘到B
2					A1个盘到C
则结果输出:			B1个盘到A
A1个盘到B			B1个盘到C
A1个盘到C			A1个盘到C
B1个盘到C

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;**/
.data
a dword 'A'
b dword 'B'
d dword 'C'
N dword ?
infmt byte '%d',0
outfmt byte '%c移1个盘到%c',13,0
.code
F proc n:dword,x:dword,y:dword,z:dword
.if n<=1
invoke printf,addr outfmt,x,z
.else
mov ecx,n
dec ecx
invoke F,ecx,x,z,y
invoke printf,addr outfmt,x,z

mov ecx,n
dec ecx
invoke F,ecx,y,x,z
.endif

ret
F endp
start:
invoke scanf ,addr infmt ,addr N
invoke F,N,a,b,d
invoke ExitProcess,0
end start
 ;**/
 

二叉树

先序遍历二叉树(树根先输出->左节点->右节点)
若运行后若输入:
ABCDEFG
则运行结果输出:
ABDECFG

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none
 ;**/
.data
B byte 80 dup(0)
infmt byte '%s',0
outfmt byte '%c',0
.code
Pre proc i:dword,n:dword
mov eax,i
.if eax<n
mov ebx,i
invoke printf,addr outfmt,dword ptr B[ebx]
mov ebx,i
imul ebx,2
add ebx,1
invoke Pre,ebx,n
mov ebx,i
imul ebx,2
add ebx,2
invoke Pre,ebx,n
.endif
ret 
Pre endp
start:
invoke scanf,addr infmt,addr B
mov al,0
lea edi,B
mov ecx,80
repne scasb
lea eax,B+1
sub edi,eax
invoke Pre,0,edi
invoke ExitProcess,0
end start
 ;**/
 

二叉树

中序遍历二叉树
(LDR 如图字符数组B的值为“ABCDEFGH^JK^MNOP^^^T”,其中“^”表示不存在的结点)
若运行后若输入:
ABCD^^G
则运行结果输出:
DBACG

.386
.model flat, stdcall
option casemap :none
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;**/
.data
B byte 80 dup(0)
infmt byte '%s',0
outfmt byte '%c',0
.code
LDR proc i:dword,n:dword
mov eax,i
.if eax<n
mov ebx,i
imul ebx,2
add ebx,1
invoke LDR,ebx,n

mov ebx,i		;eax之前运行会刷新
.if B[ebx]!='^'
invoke printf,addr outfmt,dword ptr B[ebx]
.endif

mov ebx,i
imul ebx,2
add ebx,2
invoke LDR,ebx,n
.endif
ret 
LDR endp

start:
invoke scanf,addr infmt,addr B
mov al,0
lea edi,B
mov ecx,80
repne scasb
lea eax,B+1
sub edi,eax
invoke LDR,0,edi
invoke ExitProcess,0
end start
 ;**/
 
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值