; 어셈블리와 동등한 프로그램
SECTION .data
msg: db "Arg = %s ",10,0
msg2: db "Arg Count = %d ", 10,0
SECTION .text
;출력에 대한 접근 허용
extern printf
;main 외부적 사용 가능하게 만듬
global main
main: ;int main(int numArguments, char* arg[])
push ebp
mov ebp, esp
mov eax, DWORD[ebp +8] ; 매개변수 위치
mov ebx, DWORD[ebp +12]; arg 위치
mov ecx, 0
beginLooping:
; 외부 함수는 레지스터에서 사용중인 값을 수정할 수 있기 때문에 항상 외부 함수를 호출하기 전에 값을 유지해야한다.
push ebx ;ebx 영역: 인수 주소 보유
push eax ;eax 영역: 인수의 수를 갖음
push ecx ;eax 영역: 카운터 보유
;printf 호출
push DWORD [ebx]
push msg
call printf
add esp, 8 ;스택 정리
;항상 역순으로 복원
pop ecx ;카운터 복원
pop eax ;인수의 수를 되 돌림.
pop ebx ;주소 복원
inc ecx ; 카운트 하나씩 증가
add ebx, 4 ; 배열 다음 인수로 이동
; 루프
cmp ecx, eax ;eax 같지 않으면
jne beginLooping ; jmp 실행 else, exit
mov esp , ebp
pop ebp
ret
compile.sh 변경
#!/bin/bash
numArg=$#
arch32=32
arch64=64
clear
if [ $numArg != 2 ] ; then
echo "You enter too many or too little arguments to script when expected 2, asm file"
echo "you supplied only $numArg"
echo "Usage: compile <input.asm> <program_name>"
exit
else
echo "Compiling asm using NASM"
input=$1
output=$2
inter=asm000.o
nasm -f elf$arch32 -o $inter $input
ret=$?
if [ $ret != 0 ] ; then
echo "Nasm compilation failed"
exit
else
echo "compilation using GCC for final output"
gcc -m$arch32 -o $output $inter
ret=$?
if [ $ret != 0 ] ; then
echo "There was a problem with gcc compilation"
exit
else
rm $inter
echo "Compilation successfull"
echo "Starting apllication ------------------------"
./$output arg1 arg2 arg3 arg4
echo "Application ended --------------------------"
fi
fi
fi
댓글 없음:
댓글 쓰기