외로운 Nova의 작업실

Assembly 언어 공부 - 13(덧셈, 뺄셈 실습) 본문

Programming/Assembly

Assembly 언어 공부 - 13(덧셈, 뺄셈 실습)

Nova_ 2022. 7. 28. 19:52

안녕하세요, 오늘은 덧셈과 뺄셈을 어셈블리어로 실습해보는 시간을 가져보도록 하겠습니다.

 

;this program adds adn subtracts 32-bit integers.

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

.code

main PROC

    mov eax, 10000h
    add eax, 40000h
    sub eax, 20000h
    call DumpRegs

    exit

main ENDP
END main

위 어셈블리 코드는 eax 레지스터에 10000h를 옮기고 40000h를 더하고 20000h를 빼서 결국 eax 레지스터에 30000h가 남게 만드는 코드입니다. call DumpRegs부분은 DumpRegs 프로시저가 있는 부분 주소로 이동하는데, 이전의 주소를 스택에 넣었다가 다시 되돌아올때 사용하라는 명령어 입니다. 즉 쉽게말해 DumpRegs 프로시저를 실행시키고 다시 돌아오라는 명령어이죠.

 

결국 해당 어셈블러를 실행시키면 아래와 같이 나옵니다.

 EAX 레지스터에 30000이 들어가 있는 것을 확인 할 수 있습니다. 

 

이번에는 변수를 만들고 덧셈 뺄셈을 하여 최종적으로 eax 레지스터로 옮기고 값을 내놓는 코드를 짜보도록 하겠습니다.

;this program adds adn subtracts 32-bit integers.

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

.data
val1 DWORD 10000h
val2 DWORD 40000h
val3 DWORD 20000h
finalVal DWORD ?

.code

main PROC

    mov eax, val1
    mov finalVal, eax
    mov eax, val2
    add finalVal, eax
    mov eax, val3
    sub finalval, eax

    mov eax, finalVal
    call DumpRegs

    exit

main ENDP
END main

.data 영역은 상수 및 변수들을 선언하는 공간입니다. 또한 아무런 값을 넣지 않고 싶을떄 ? 키워드를 씁니다. 또한, mov finalVal, val1 와 같은 변수들사이의 직접적인 값 교환은 어려우므로 중간다리 역할로 eax가 끼게됩니다. 결국 해당 코드를 실행하면 이전과 같은 결과가 나옵니다.

다음시간에는 데이터 전송과 관련된 실습을 진행해보겠습니다.

Comments