헛소리 ¶
- ì�Œ... 어셈블리 언어로 짜니 줄 수가 ì—„ì²ë‚˜ê²Œ 나오는 êµ°ìš”...
- ê·¸ë¦¬ê³ ì�´ê²Œ ì�´í‹€ì�´ë‚˜ 걸린 ì�´ìœ 는 ì „ 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










