카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/06

asm 인수 전달 값 확인

; 어셈블리와 동등한 프로그램
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

댓글 없음:

댓글 쓰기