вызов fscanf в сборке с использованием nasm - PullRequest
2 голосов
/ 25 апреля 2011

Я пытаюсь прочитать 3 значения из файла в формате целое число пробел целое число.Например:

5, 3

В этом формате точный , то есть: без пробела после 5, пробел после запятой и без пробела после 3.

Я успешно вызвал fopen, чтобы открыть файл, и использовал fgetc, чтобы получить доступ к тому же файлу и распечатать его содержимое.Теперь я пытаюсь использовать fscanf ()

Я прочитал, что для вызова функции C из сборки необходимо поместить параметры в обратном порядке в стек, ниже приведен мой код для этого

    lea eax, [xValue]
    push eax
    lea eax, [comma]
    push eax
    lea eax, [yValue]
    push eax
    mov eax, [format] ;defined as [format db "%d %c %d", 0] in the data section
    push eax
    mov eax, ebx ; move handle to file into eax
    push eax
    call _fscanf

На данный момент я предполагаю, что приведенное выше эквивалентно:

fscanf(fp, "%d %c %d", &yValue, &comma, &xValue);

Если оно эквивалентно приведенному выше, как я могу получить доступ к прочитанным значениям?Я знаю, что правильно обращаюсь к файлу, так как смог распечатать отдельные символы, вызвав fgetc, но для ясности ниже мой код для открытия файла

    mov eax, fileMode
    push eax
    mov eax, fileName
    push eax
    call _fopen                
    mov ebx, eax ;store file pointer

Любая помощь / совет очень важен,Спасибо.

Отредактировано, чтобы добавить…

Ответ предоставил решение.Разместите код ниже для всех, у кого есть эта проблема.

section .data

    fname db "data.txt",0
    mode db "r",0                                ;;set file mode for reading
    format db "%d%c %d", 0

;;--- end of the data section -----------------------------------------------;;

section .bss
    c resd 1
    y resd 1
    x resd 1
    fp resb 1

section .text
    extern _fopen
    global _main

_main:        
    push ebp
    mov ebp,esp

    mov eax, mode
    push eax
    mov eax, fname
    push eax
    call _fopen                
    mov [fp] eax ;store file pointer

    lea eax, [y]
    push eax        
    lea eax, [c] 
    push eax
    lea eax, [x]        
    push eax
    lea eax, [format]
    push eax
    mov eax, [fp] 
    push eax
    call _fscanf

    ;at this point x, y and c has the data

    mov eax,0
    mov esp,ebp
    pop ebp
    ret

1 Ответ

3 голосов
/ 25 апреля 2011

Я думаю, что ваша строка формата scanf () неверна.Должно быть "% d% c% d".В любом случае, почему вы заботитесь о запятой?Почему бы просто не использовать "% d,% d" и пропустить переменную запятой.

Кроме того, вы пытаетесь загрузить eax со значением из первых байтов [format], вам нужно нажать указатель наformat.

Наконец, вам не нужны скобки вокруг адресов памяти, если ваш ассемблер не странен, вы нажимаете неверные адреса.

lea eax, xvalue
push eax
lea eax, yValue
push eax
lea eax, format
push eax
call _fscanf

Теперь у вас должны быть значения, которые выхочу в xvalue и yvalue

...