文字列を整数に変換する方法がわかりません。
これは宿題ですが、問題への回答は必要ありません -- (AKA 正しいコード)。誰かが私が間違っていることを説明できれば、本当に感謝しています! :(
前もって感謝します!!!
32 ビットの仮想マシンで Ubuntu 12.04 を実行しています。
私はコンパイルします:
nasm -f elf proj2.asm
私はリンクします:
gcc -o proj2 proj2.o
そしてそれを実行します:
./proj2
最初の番号が表示されますが、使用しようとするとセグメンテーション違反が発生しますatoi
。
私には、私たちに次のことを望んでいる先生がいます。
次のように配置されたテキスト ファイルから数値を読み取ります。
4 5 4 2 9
(各整数の前に空白があります)
彼の指示によると、「行全体を取得するには、必ず7文字をバッファに読み取ってください。これらは、文字CRおよびLFとともに数字を表す5文字です。CRは、16進コード0x0D
とLFを含むキャリッジリターン文字です。は 16 進コードの改行文字です0x0A
。")
ファイルからスペースを消去して、そのように読み取ろうとしましたが、役に立ちませんでした。
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
セグメンテーション違反が発生すること。