使用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
;*】*/