2012-04-04 5 views
1

이 (Linux, AT & T, Intel) x86 프로그램은 세 가지 인수를 읽고 % ebx에서 가장 큰 값을 존재 상태로 저장합니다. 인수를 레지스터로 팝하면 결과 값은 바이트로 보입니다. int 값을 얻으려면 어떻게해야합니까?x86 AT & T 어셈블리의 명령 줄 인수 처리

[편집 -. 내가 질문 내가 인수의 int 값을 얻을 수 atoi을 사용하여 어떻게 생각 아래 해롤드의 의견 덕분에]

.section .text 

.globl _start   

_start: 
popl %edi  # Get the number of arguments 
popl %eax  # Get the program name 
popl %ebx  # Get the first actual argument 
movl (%ebx), %ebx # get the actual value into the register (?) 
popl %ecx  # ; 
movl (%ecx), %ecx 
popl %edx  # 
movl (%edx), %edx 

bxcx: 
cmpl %ebx,%ecx 
jle  bxdx 
movl %ecx,%ebx 
bxdx: 
cmpl %ebx,%edx 
jle end 
movl %edx,%ebx 

end: 
movl $1,%eax   
int $0x80   
+0

무엇 int 값을 할 수

int atoi(const char *nptr); 

그래서 첫 번째 명령 행 인수의 정수 값을 얻을 수 있습니다? 'atoi '에 해당하는 것을 찾고 계십니까? – harold

+0

프로그램이'./a.out 5 6 7'처럼 실행 된 후 명령 행 args의 int 값 -이 경우 종료 상태는 7이어야합니다. 그래서'atoi'와 같은 것이 필요하다면, 즉 값 5, 6 등은 문자열로 읽혀지는 것을 의미합니까? – jaybee

답변

3

는거야, atoi를 호출 할 수 있도록 libc에 링크해야합니다. 예컨대 :

ld -lc foo.o 

실제로 전화를 걸려면 당신은 cdecl을 호출 규칙을 따라야합니다 : 기능에

  1. 인수는 왼쪽 인수가 마지막으로 밀려와 스택에 전달됩니다.
  2. 함수의 반환 값은 누산기 (이 경우 % eax)에 저장됩니다.
  3. % ebp, % esi, % edi 및 % ebx 레지스터는 호출간에 보존되므로 임시 저장을 위해 사용할 수 있습니다.
  4. 다른 모든 필요한 레지스터는 호출 코드 (위의 호출 수신자 저장 레지스터, 인수 앞의 스택 또는 메모리의 다른 위치)에 저장해야합니다.

atoi의 서명은, 우리가

.section .text 

.globl _start   

_start: 
popl %edi  # Get the number of arguments 
popl %eax  # Get the program name 
call atoi  # Try to read the first argument as an integer and clobber %eax with the value 
+0

감사합니다. 가장 도움이됩니다. – jaybee

+0

이 작업을하려면 동적으로 링크해야했습니다 :'ld -dynamic-linker /lib/ld-linux.so.2 -o test -lc test.o' – jaybee