win32汇编以.386指令的MASM32题目做题记录 -- 递归程序设计(3-31、4-01中序遍历与先序遍历二叉树)

使用IDE调试:
https://blog.csdn.net/c44303436/article/details/88947233

//汉诺塔

哈皮诺塔思路来源:
https://blog.csdn.net/xb2355404/article/details/79144451

#Ver2.0

.386
.model flat, stdcall
option casemap : none

include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib

printf PROTO C:DWORD ,:vararg
scanf PROTO C:DWORD ,:vararg

.data
InFmt BYTE '%d',0
OutFmt BYTE '%c移1个盘到%c', 0AH, 0

.data?
movetimes DWORD ?


.code
moved PROC first:DWORD, third:DWORD
invoke printf,ADDR OutFmt, first, third
RET
moved endP

hanoi PROC n:DWORD, first:DWORD, second:DWORD, third:DWORD
.IF n == 1
    invoke moved, first, third
.ELSE
MOV EDX, n
DEC EDX
invoke hanoi, EDX,  first, third, second
invoke moved,  first,  third
MOV EDX, n
DEC EDX
invoke hanoi, EDX,  second,  first, third
.ENDIF

RET
hanoi ENDP
start:
invoke scanf, ADDR InFmt, ADDR movetimes
invoke hanoi, movetimes,'A', 'B', 'C'
invoke ExitProcess, 0
end start

#ver1.0

.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
InFmt BYTE '%d', 0
OutFmt BYTE '%c移1个盘到%c', 0AH , 0

.data?
n DWORD ?

.code
moved PROC a:DWORD, c_:DWORD
MOVZX EAX, BYTE PTR a
MOVZX EBX, BYTE PTR c_
invoke printf,ADDR OutFmt, EAX, EBX
RET
moved ENDP

hanoi PROC n_:DWORD, a:DWORD, b:DWORD, c_:DWORD
MOVZX EAX, BYTE PTR a
MOVZX EBX, BYTE PTR b
MOVZX ECX, BYTE PTR c_
  .IF n_ == 1
  invoke moved, a, c_
  MOVZX EAX, BYTE PTR a
  MOVZX EBX, BYTE PTR b
  MOVZX ECX, BYTE PTR c_
  .ELSE
  MOV EDX, n_
  DEC EDX
  invoke hanoi, EDX, EAX, ECX, EBX
  MOVZX EAX, BYTE PTR a 
  MOVZX EBX, BYTE PTR b
  MOVZX ECX, BYTE PTR c_
  invoke moved, EAX, ECX
  MOVZX EAX, BYTE PTR a
  MOVZX EBX, BYTE PTR b
  MOVZX ECX, BYTE PTR c_
  MOV EDX, n_
  DEC EDX
  invoke hanoi, EDX, EBX, EAX, ECX
  .ENDIF
RET
hanoi ENDP
start:
invoke scanf, ADDR InFmt, ADDR n
invoke hanoi, n, 'A', 'B', 'C'
end start
invoke ExitProcess,0

 ;*】*/

//中序遍历二叉树

c语言实现数组遍历:https://blog.csdn.net/qq_36926514/article/details/80273551
//’^'表示空结点

.386
.model flat, stdcall
option casemap : none

include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib

printf PROTO C:DWORD ,:vararg
scanf PROTO C:DWORD ,:vararg

.data
Fmt BYTE '%c',0


.data?
s BYTE 80 DUP(?)
t DWORD ?
put BYTE ? 

.code
printDTree PROC index:DWORD
MOV EDX, index
.IF EDX >= t
    RET
.ENDIF

MOV EAX, index
IMUL EAX, 2
INC EAX
invoke printDTree,EAX
MOV EBX, 0
MOV ESI, index
.IF s[EBX+ESI] != '^'
invoke printf, ADDR Fmt, s[EBX+ESI]
.ENDIF
MOV EAX, index
IMUL EAX, 2
INC EAX
INC EAX
invoke printDTree,EAX
RET
printDTree ENDP

start:
invoke scanf,ADDR Fmt, ADDR put
MOV ESI, 0
LEA EDI, s
.while EAX != -1
    MOV BL, put
    MOV [EDI], BL
    INC EDI
    INC ESI
    invoke scanf,ADDR Fmt, ADDR put
.endw
MOV t, ESI
invoke printDTree, 0
invoke ExitProcess, 0
end start

#ver1.0

.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
Fmt BYTE '%c',0
FmtS BYTE '%s',0
s BYTE 80 DUP(0)

.data?
c1 BYTE ?
t DWORD ?

.code
printDTree PROC ps:DWORD, n:DWORD
LOCAL index:DWORD
LOCAL _temp:DWORD
  ;PUSHAD
  MOV ESI , n
  MOV index , ESI
  .IF ESI >= t 
    RET
  .ENDIF
  MOV EAX , ps
  MOV BL , [EAX+ESI]
  MOV c1 , BL
  SHL ESI , 1
  INC ESI
  MOV n , ESI
  invoke printDTree, ps, ESI
  MOV _temp , ESI
  MOV ESI , index
  MOV BL , [EAX+ESI]
  MOV c1 , BL
  .IF c1 != 0AH && c1 != '^'
  invoke printf, ADDR Fmt, c1
  .ENDIF
  MOV EAX , ps
  MOV ESI , n
  INC ESI
  invoke printDTree, ps, ESI  
  ;POPAD
  RET
printDTree ENDP

start:
MOV ESI, 0
LEA EDI, s
invoke scanf,ADDR Fmt,ADDR c1
.while EAX != -1
  MOV BL , c1
  MOV [EDI] , BL
  INC EDI
  INC ESI
  invoke scanf, ADDR Fmt, ADDR c1
.endw

;invoke printf, ADDR FmtS,ADDR s
MOV t, ESI
invoke printDTree, ADDR s, 0
invoke ExitProcess,0
end start 
 ;*】*/

//先序遍历二叉树

#ver2.0

.386
.model flat, stdcall
option casemap : none

include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib

printf PROTO C:DWORD ,:vararg
scanf PROTO C:DWORD ,:vararg

.data
Fmt BYTE '%c',0


.data?
s BYTE 80 DUP(?)
t DWORD ?
put BYTE ? 

.code
printDTree PROC index:DWORD
MOV EDX, index
.IF EDX >= t
    RET
.ENDIF
MOV EBX, 0
MOV ESI, index
invoke printf, ADDR Fmt, s[EBX+ESI]
MOV EAX, index
IMUL EAX, 2
INC EAX
invoke printDTree,EAX
MOV EAX, index
IMUL EAX, 2
INC EAX
INC EAX
invoke printDTree,EAX
RET
printDTree ENDP

start:
invoke scanf,ADDR Fmt, ADDR put
MOV ESI, 0
LEA EDI, s
.while EAX != -1
    MOV BL, put
    MOV [EDI], BL
    INC EDI
    INC ESI
    invoke scanf,ADDR Fmt, ADDR put
.endw
MOV t, ESI
invoke printDTree, 0
invoke ExitProcess, 0
end start

#ver1.0

.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
Fmt BYTE '%c',0
FmtS BYTE '%s',0
s BYTE 80 DUP(0)

.data?
c1 BYTE ?
t DWORD ?

.code
printDTree PROC ps:DWORD, n:DWORD
  ;PUSHAD
  MOV ESI , n
  .IF ESI >= t 
    RET
  .ENDIF
  MOV EAX , ps
  MOV BL , [EAX+ESI]
  MOV c1 , BL
  .IF c1 != 0AH
  invoke printf, ADDR Fmt,c1
  .ENDIF
  SHL ESI , 1
  INC ESI
  MOV n , ESI
  invoke printDTree, ps, ESI
  MOV ESI , n
  INC ESI
  invoke printDTree, ps, ESI  
  ;POPAD
  RET
printDTree ENDP

start:
MOV ESI, 0
LEA EDI, s
invoke scanf,ADDR Fmt,ADDR c1
.while EAX != -1
  MOV BL , c1
  MOV [EDI] , BL
  INC EDI
  INC ESI
  invoke scanf, ADDR Fmt, ADDR c1
.endw

;invoke printf, ADDR FmtS,ADDR s
MOV t, ESI
invoke printDTree, ADDR s, 0
invoke ExitProcess,0
end start 

 ;*】*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值