U E D R , A S I H C RSS

Hanoi Problem/��

헛소리

  • ì�Œ... 어셈블리 언어로 짜니 줄 수가 엄청나게 나오는 êµ°ìš”...
  • 그리고 ì�´ê²Œ ì�´í‹€ì�´ë‚˜ 걸린 ì�´ìœ ëŠ” ì „ push를 하면 ê°� 변수 별로 스íƒ�ì�´ 있는 줄 알아서 popì�˜ 순서가 ìƒ�ê´€ì�´ 없다고 ìƒ�ê°�했는ë�°, 그게 아니ë�¼ 스íƒ�ì�€ 하나ë�¼ì„œ pushì�˜ 반대 순서로 popì�„ 해야 하는 것ì�´ë�”êµ°ìš”.

코드

~cpp 
;하노�� 탑
.model small
.stack 100h

.data
message1 db "have move ", '$'
message2 db "th disk from ", '$'
message3 db "to ", '$'
n dw 5			;disk� 갯수
from dw 1		;시작 기둥(1번)
by dw 2			;중간 기둥(2번)
to dw 3			;목�지 기둥(3번)	

.code
extrn Crlf:proc
extrn Writeint:proc

main proc
	mov ax, @data
	mov ds, ax
	mov bx, 10	;Writeint사용시� 10진수 출력

	call Move	;Move함수 호출
			;Move(from, to, by)
	mov ax, 4C00h	;종료
	int 21h
main endp

Move proc		;Move 프로시저(재귀호출ë�˜ëŠ” ë€ë¶„)
	cmp n, 0	;n=0�면
	jz endmove	;Move 프로시저� �으로 �
	
	push n		;n값� 스�� 넣�
	dec n		;n-1

	push from	;from� 스�� 넣�
	push by		;by를 스�� 넣�
	push to		;to를 스�� 넣�
	
	mov ax, by	;by와 to� 위치를 바꿔줌.(ax를 temp로 사용)
	mov si, to	;메모리 간� 대입� 안 �므로
	mov by, si	;si를 �용해 대입
	mov to, ax

	call Move	;Move(n-1, from, by, to)
			;(by와 to� 위치를 바꿔서 함수 호출)
	pop to		;다시 to, by, from, n� 순서대로 꺼냄
	pop by		;스��므로 빼는 순서� 유�해야 한다
	pop from		
	pop n
	
	mov ah, 9	;message1� 출력
	mov dx, offset message1
	int 21h
	
	mov ax, n	;몇번째 디스�를 옮기는지 출력
	call Writeint
	
	mov dx, offset message2
	mov ah, 9	;message2를 출력
	int 21h

	mov ax, from	;옮기는 시작� 출력
	call Writeint
	call Space	;한칸 �고

	mov dx, offset message3
	mov ah, 9	;message3� 출력
	int 21h

	mov ax, to	;목�지 출력
	call Writeint

	call Crlf	;줄바꿈

	push n		;n� 다시 스�� 넣고
	dec n		;n-1

	push from	;from, by, to를 차례로 스�� 넣�
	push by
	push to

	mov ax, from	;from과 by를 바꿈(ax를 temp로 하여)
	mov si, by	;메모리 간 대입 허용 안 하므로
	mov from, si	;si를 �용해서 대입
	mov by, ax
	
	call Move	;Move(by, to, from) 호출 
	
	pop to		;to, by, from, n순으로 스��서 뺌
	pop by
	pop from	
	pop n

	endmove:	
	ret		;프로시저 �
Move endp

Space proc		;�어쓰기 함수
	mov dl, " "
	mov ah, 2
	int 21h		;빈칸� 출력
	ret
Space endp

end main		;프로그램 종료

작성�: Yggdrasil

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:21
Processing time 0.0319 sec