문자열을 정수로 변환하는 방법을 모르겠다.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
(공백 각 정수 전에이)
: 너무로 배열 된 텍스트 파일에서 숫자읽기 :
나는 우리를 원하는 교사가
그의 지시에 따라 경찰 : "전체 라인을 얻기 위해 버퍼에 일곱 (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를 얻는다.
입력 파일은 유닉스/리눅스 스타일의 LF 라인 엔딩이 아닌 Windows 스타일의 CR-LF 라인 엔딩을 사용합니까? –
나는 그렇게 믿는다. 나는 그 차이가 무엇인지 모르겠다 - 그들이 동일하지 않은가? 관련성이 있는지는 잘 모르겠지만 출력물을 얻지 못하면 atoi를 호출하기 전에 printf를 호출하면 형식이 다음과 같습니다. (공백 = _-_-_) -_-_- _4 그래서 줄을 잘 잡을 것입니다. 그것은 작동하지 않는 정수로의 변환입니다 :/ – origamimadness
아니, 그들은 같지 않습니다. Windows 스타일의 텍스트 파일은 CR 및 LF (C 구문에서는'\\ ',''\ n ')의 2 문자 시퀀스로 각 행을 종료합니다. 유닉스 스타일의 텍스트 파일은 단 하나의 LF 문자 만 사용합니다. C에서 텍스트 모드 I/O는 필요에 따라 줄 끝 문자를 자동으로''\ n ''로 변환하므로 입력에'getc'와'fscanf'를 사용하면됩니다. 그러나 비 네이티브 형식의 파일을 다루는 경우 더 복잡합니다. –