외로운 Nova의 작업실

Assembly 언어 공부 - 24(조건부 제어흐름 디렉티브) 본문

Programming/Assembly

Assembly 언어 공부 - 24(조건부 제어흐름 디렉티브)

Nova_ 2022. 8. 30. 12:44

안녕하세요. 이번시간에는 조건부 제어흐름을 조금이나마 쉽게 할 수 있는 디렉티브를 알아볼까합니다. 간단하게 말하면 고급언어에서 사용하는 if, while 문을 어셈블러 디렉티브로 작성하면 어셈블러가 그것을 해것하여 어셈블리어로 변경해줍니다. 

 

- .IF 디렉티브

고급언어에서 if 문과 같은 .IF 디렉티브에 대해서 알아보겠습니다. eax가1이면 ebx = 321, eax가 2면 ebx = 456, eax 가 3이면 ebx = 789를 넣는 어셈블리어 코드를 .IF 디렉티브를 이용해 짜보도록 하겠습니다.


;-----------------INCLUDE-------------------------
;
include 	c:\assembly\irvine32.inc
includelib  c:\assembly\irvine32.lib
includelib  c:\assembly\kernel32.lib
includelib  c:\assembly\user32.lib
;-----------------------------------------------


.data

.code
main PROC

    pushad

    mov eax, 2d
    .IF eax == 1
    mov ebx, 123h
    .ELSEIF eax == 2
    mov ebx, 456h
    .ELSEIF eax == 3
    mov ebx, 789h
    .ENDIF

    call DumpRegs

    popad
    
main ENDP

END main

위와 같은 코드를 짜면, 어셈블러는 .IF 디렉티브, .ELSEIF 디렉티브, .ENDIF 디렉티브를 인식하여 논리 구조에 맞는 어셈블러를 생성하여 기계어로 변환시켜줍니다.

 

- .WHILE 디렉티브와 .REPEAT 디렉티브

이번에는 고급언어에서 사용하는 While문을 .WHILE 디렉티브와 .REPEAT 디렉티브로 구현해보도록 하겠습니다. 간단하게 0부터 10까지 콘솔에 출력하는 프로그램을 짜보도록 하겠습니다.


;-----------------INCLUDE-------------------------
;
include 	c:\assembly\irvine32.inc
includelib  c:\assembly\irvine32.lib
includelib  c:\assembly\kernel32.lib
includelib  c:\assembly\user32.lib
;-----------------------------------------------


.data

.code
main PROC

    pushad

    mov eax, 0
    .WHILE eax < 10
        inc eax
        call WriteDec
        call Crlf
    .ENDW

    mov eax, 0
    .REPEAT
        inc eax
        call WriteDec
        call Crlf
     .UNTIL eax == 10
     
    popad
    
main ENDP

END main

위 코드를 실행시키면,

잘 실행 되는 것을 볼 수 있습니다. 이코드도 마찬가지로 어셈블러가 .WHILE 디렉티브와 .REPEAT 디렉티브를 인식하여 논리구조에 맞는 어셈블리어로 변환 시켜 기계어로 만들어줍니다.

Comments