2013-03-18 2 views
0

문자열을 정수로 변환하는 방법을 모르겠다.x86 NASM Linux 어셈블리의 ATOI 관련 문제

숙제를 위해, 하지만 나는 (AKA 올바른 코드) 문제에 대한 답변을 원하지 않습니다. 만약 누군가 내가 잘못하고 있다고 설명 할 수 있다면 정말 고마워! :(사전에

감사합니다!

내가 가상 머신에 우분투 12.04를 실행하는거야, 내가 컴파일 32 비트

: 내가와 연결

nasm -f elf proj2.asm 

:.

gcc -o proj2 proj2.o 

하고 실행 :

./proj2 

첫 번째 숫자를 표시하지만 atoi을 사용하려고하면 세그먼트 오류가 발생합니다.

4 
5 
4 
2 
9 

(공백 각 정수 전에이)

: 너무로 배열 된 텍스트 파일에서 숫자

  1. 읽기 :

    나는 우리를 원하는 교사가

    그의 지시에 따라 경찰 : "전체 라인을 얻기 위해 버퍼에 일곱 (7) 문자를 읽어 보시기 바랍니다이 다섯입니다. 문자 CR 및 LF와 함께 숫자를 나타내는 문자. CR은 16 진 코드 0x0D 인 캐리지 리턴 문자이고 LF는 16 진 코드 0x0A 인 줄 바꿈 문자입니다. ")

    파일에서 공백을 지우고 그런 식으로 읽으려고했으나 ' t의 도움의 int는 (250)의 INT의 최대 수로, 스택에 배열로, 읽을 수 있습니다

    비록 문제가 아니에요 :. 아래/

    지금까지 내 코드입니다

    .
    BUFFERSIZE equ 10 
    
    section .data 
        file_name: db "/home/r/Documents/CS/project2/source/indata.txt", 0x00 
        file_mode: db "r", 0x00 
        output: db "%i",0xa 
        test: db "hello world",10 
        format: db "%u" 
        numToRead: db 1 
        temp: db "hi" 
        num:db "1",0,0 
    section .bss 
        fd: resd 4 
        length: resd 4 
        buffer resb BUFFERSIZE 
              ;i was trying to use buffers and just 
              ;read through each character in the string, 
              ;but i couldn't get it to work 
    section .text 
    extern fopen 
    extern atoi 
    extern printf 
    extern fscanf 
    
    extern fgets 
    extern getc 
    extern fclose 
    global main 
    
    main: 
            ;setting up stack frame 
        push ebp 
        mov  ebp, esp 
    
            ;opens file, store FD to eax 
        push file_mode 
        push file_name 
        call fopen 
    
            ;save FD from eax into fd  
        push eax 
        mov  ebx,eax 
        mov  [fd],ebx 
    
            ;ebx holds the file descriptor 
            ;push in reverse order 
        push ebx 
        push numToRead 
        push temp 
        call fgets  
    
        push eax 
        call printf  ;prints length (this works, i get a 4. 
            ;Changing the number in the file changes the number displayed. 
            ;I can also read in several lines, just can't get any ints! 
            ;(So i can't do any comparisons or loops :/) 
    
    
            ;i shouldn't need to push eax here, right? 
            ;It's already at the top of the stack from the printf 
        ;pop eax 
        ;push eax 
        call atoi 
             ;calling atoi gives me a segmentation fault error 
        push eax 
        call printf 
    
        mov esp,ebp 
        pop ebp 
        ret 
    

    편집 : 흥미롭게도, atoi는 괜찮다고 부를 수 있습니다. 그때 내가하려고 할 때

    push eax 
    call atoi 
    push eax 
    call printf 
    

    나는 segmentation fault를 얻는다.

+0

입력 파일은 유닉스/리눅스 스타일의 LF 라인 엔딩이 아닌 Windows 스타일의 CR-LF 라인 엔딩을 사용합니까? –

+0

나는 그렇게 믿는다. 나는 그 차이가 무엇인지 모르겠다 - 그들이 동일하지 않은가? 관련성이 있는지는 잘 모르겠지만 출력물을 얻지 못하면 atoi를 호출하기 전에 printf를 호출하면 형식이 다음과 같습니다. (공백 = _-_-_) -_-_- _4 그래서 줄을 잘 잡을 것입니다. 그것은 작동하지 않는 정수로의 변환입니다 :/ – origamimadness

+0

아니, 그들은 같지 않습니다. Windows 스타일의 텍스트 파일은 CR 및 LF (C 구문에서는'\\ ',''\ n ')의 2 문자 시퀀스로 각 행을 종료합니다. 유닉스 스타일의 텍스트 파일은 단 하나의 LF 문자 만 사용합니다. C에서 텍스트 모드 I/O는 필요에 따라 줄 끝 문자를 자동으로''\ n ''로 변환하므로 입력에'getc'와'fscanf'를 사용하면됩니다. 그러나 비 네이티브 형식의 파일을 다루는 경우 더 복잡합니다. –

답변

2

휴대 전화에서는 볼 수 없지만 전화를 건 후에는 스택 균형을 조정하지 않는 한. 그 c 함수는 stdcall이 아니므로 각 호출 후에 스택을 조정해야합니다. 내가 할 : 당신의 독방 감금 오류의 원인이 될 수

add esp, 4 * numofpushes.

+0

안녕 Gunmer, 당신은 내가 전화를 한 후에 스택 균형을 맞추고 있지 않다는 것이 맞습니다. 그래도 상관 없니? 맨 위에는 스택 포인터를 보존하고 하단에 반환합니다. 표준 작업 절차가 아닌가요? 감사합니다. – origamimadness

+0

(난 그냥 추가 esp 4 * numofpushes, 아니 주사위를 추가하려고 : /) 감사합니다! – origamimadness

+0

중요합니까? 네, 그게 중요합니다 !!!! 학습 어셈블리? 처음에는 올바른 방법으로 배우십시오. 나중에 문제가 줄어들 것입니다. 대부분의 C 함수는 스택을 정리하지 않으므로 수행해야합니다. 그리고 당신은 numofpushes를 실제 숫자로 바꿨습니까? – Gunner

0

편집 : 흥미롭게도 atoi는 괜찮습니다.그때 내가 세그멘테이션 오류를 얻을 수

push eax 
    call atoi 
    push eax 
    call printf 

하려고 할 때입니다.

atoi reference : "성공하면 함수는 변환 된 정수를 int 값으로 반환합니다.".
다음의 printf (즉, format 문자열 포인터)의 첫 번째 인수로 임의의 정수 (예 : 4)를 전달하는 것이 잘 종료되지 않을 수 있습니다.

+0

(현재이 코드가 문제가 아닌지 다시 확인하기 위해 현재 실행 중입니다. – origamimadness

관련 문제