Я пытаюсь прочитать 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