2014-04-30 9 views
2

Possible duplicate exist 그러나이 문제를 비슷한 방법으로 적용 할 방법을 찾지 못했습니다.x86 AT & T 어셈블리의 데이터 변수 주소를 얻는 것

반환 할 함수를 만들고 있는데, 정수는 x86 AT & T 어셈블리의 문자열입니다.

변수를 선언하는 코드는 resdes입니다.

 .data 
    .align 4 
resdes: .long 12 

resdes 이제 (I을 올바르게 이해?) 내가 사용하는 무료 11 다른 바이트 다음에 메모리 위치를 가리 킵니다.

한 번에 하나의 숫자를 정수에서 바이트로 하나씩로드하려고합니다. 위의 코드에서

ifd: 
    movl  (%esp, %ecx), %eax //This loads %eax with my int 
    movl  resdes, %ecx  //This is incorrect and causes errors later 
    inc   %ecx 
    movl  $10, %ebx  //Division by 10 to basically do a modulo operation 
    cdq 

divloop: 
    div   %ebx 

    movb  %dl, (%ecx)  //This is where I move the digit into the memory 
           //And here I get the ERROR because (%ecx) does 
           //not contain the proper address 

    inc   %ecx    //And set the pointer to point to the next byte 

    cmp   $0, %eax   //If there are noe more digits left we are finished 
    je   divfinish1 

    jmp   divloop   //I leave out alot of the code that I know 
           //work because it's not relevant 

내 문제가 %ecx 레지스터에 resdes의 실제 주소를 받고, 첫 번째 줄이 내 코드입니다. 내가 알고있는 한, 내용은이고 resdes- 주소는 %ecx입니다. 이것은 내가 원하는 것이 아닙니다.

답변

2

당신은 "시간을 조립"에서 계산되는 상수와 ECX를로드 할. 접두어로 '$'를 사용하여 resdes의 상수를 상수로 얻으려면 movl $resdes, %ecx을 사용하십시오.

+0

감사가 해결되지 않기 때문에이 실제 문제가 무엇인지 더 분명하게,이를 시도 할 것이다 –

0

문제는 당신이 나누기를 수행 한 후에 % ebx 레지스터에 나누기의 결과를 저장하지 않으므로, 그 나누기가 영원히 계속되고, 항상 같은 모듈과 나누기 결과를 반환합니다. 동일한 숫자를 계속 나눈다. 결과는 결국 결과를 위해 예약 된 12 바이트를 오버플로하기 때문에 차례로 SIGSEGV로 연결됩니다. 여기에 가능한 솔루션입니다 :

ifd: 
    movl  resdes, %ecx 
    inc   %ecx 
    movl  $10, %ebx  
    cdq 

divloop: 
    div   %ebx 

    movb  %dl, (%ecx) 
    inc   %ecx  

    movl  %eax,%ebx   //Stores the new value in %ebx 

    cmp   $0, %eax   
    je   divfinish1 

    jmp   divloop   

resdes 지금 내가 사용하는 무료 11 다른 바이트 다음에 메모리 위치를 가리키는 (I을 올바르게 이해?).

예.

+0

가 % eax에의 로딩 내 코드를 업데이트, 그래서 이것은 그것을 –

1

좋아요, 그래서 나는 이것을 스스로 해결했습니다. 기본적으로 메모리 저장 장치를 모두 제거하고 대신 스택을 사용합니다.

이 주소를 올바르게 얻는 방법에 대한 내 질문에 대답하지 않지만 내 코드를 작동하도록 여기에 넣어.

ifd: 

    movl  (%esp, %ecx), %eax 
    add   $4, %ecx 
    movl  $10, %ebx 
    pushl  $0 

divloop: 
    cdq 
    div   %ebx 

    add   $48, %edx 
    pushl  %edx 

    cmp   $0, %eax 
    je   divfinish1 

    jmp   divloop 

divfinish1: 
    movl  tempb, %ebx 

divfinish2: 
    popl  %edx 

    cmp   $0, %edx 
    je   divfinish3 //this is the end 

    movb  %dl, (%ebx) 
    inc   %ebx 

    jmp   divfinish2