0

文字列を整数に変換する方法がわかりません。

これは宿題です、問題への回答は必要ありません -- (AKA 正しいコード)。誰かが私が間違っていることを説明できれば、本当に感謝しています! :(

前もって感謝します!!!

32 ビットの仮想マシンで Ubuntu 12.04 を実行しています。

私はコンパイルします:

nasm -f elf proj2.asm

私はリンクします:

gcc -o proj2 proj2.o

そしてそれを実行します:

./proj2

最初の番号が表示されますが、使用しようとするとセグメンテーション違反が発生しますatoi

私には、私たちに次のことを望んでいる先生がいます。

  1. 次のように配置されたテキスト ファイルから数値を読み取ります。

    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 

セグメンテーション違反が発生すること。

4

2 に答える 2

3

携帯電話で見ることができない場合を除きますが、通話後にスタックのバランスをとっていません。これらの c 関数は stdcall ではないため、呼び出しごとにスタックを調整する必要があります。そうです:

add esp, 4 * numofpushes それがセグ フォールトの原因である可能性があります。

于 2013-03-18T20:05:30.270 に答える
0

編集: 興味深いことに、atoi を問題なく呼び出すことができます。それは私がしようとするときです

  push eax
  call atoi 
  push eax
  call printf 

セグメンテーション違反が発生すること。

atoi リファレンスから: 「成功すると、関数は変換された整数を int 値として返します。」.
ランダムな整数 ( など4) を後続の最初の引数printf(つまり、format文字列ポインター) として渡すと、適切に終了しない可能性があります。

于 2013-03-18T20:32:50.553 に答える