У меня возникли проблемы с тем, чтобы функция c atof() работала в моей программе asm. Я пытаюсь прочитать 4 числа с клавиатуры и в конечном итоге вывести их среднее значение. Однако, прежде чем я смогу это сделать, мне нужно преобразовать числа в числа с плавающей запятой. Я застрял в том, чтобы успешно заставить мою переменную "total" работать. Я пытался вызвать atof в нескольких местах, но безрезультатно.
Это программа x86 NASM
; nasm -f elf -l prg2.lst prg2.asm
; gcc -o prg2 prg2.o
; ./prg2
SECTION .DATA
prompt DB 'enter a test score.', 13,10
fmt DB "%s",0
fmtf DB "%f",0
SECTION .bss
test1 resb 1000 ;reserves variable names to
test2 resb 1000 ;put stuff in
test3 resb 1000
test4 resb 1000
total resb 1000
SECTION .code
extern printf
extern scanf
extern atof
global main
main:
push ebp
mov ebp, esp
push prompt
call printf
add esp, 4 ;prompt user
push test1 ;push test1 variable
push fmt
call scanf
add esp, 8 ;store test1 variable
push prompt
call printf
add esp, 4 ;prompt user
push test2 ;push test2 variable
push fmt
call scanf
add esp, 8 ;store test2 variable
push prompt
call printf
add esp, 4 ;prompt user
push test3 ;push test3 variable
push fmt
call scanf
add esp, 8 ;store test3 variable
push prompt
call printf
add esp, 4 ;prompt user
push test4 ;push test4 variable
push fmt
call scanf
add esp, 8 ;store test4 variable
mov eax,[test1]
add eax,[test2]
add eax,[test3]
add eax,[test4]
call atof
mov [total], eax
push total
call printf ;not printing what i want,
add esp,4 ;or printing anything at all
push test1 ;printing scores for verification
call printf
add esp, 4
push test2
call printf
add esp, 4
push test3
call printf
add esp, 4
push test4
call printf
add esp, 4
mov esp, ebp
pop ebp
ret
РЕДАКТИРОВАТЬ: после пересмотра я смог преобразовать введенные значения в соответствующие числовые значения, используя эти кодовые блоки
mov eax, 0 ;
add eax,[test1] ;put test1 value in eax
mov [total], eax
sub eax, '0'
add eax,[test2]
mov [total], eax
sub eax,'0'
add eax,[test3]
mov [total], eax
sub eax,'0'
add eax,[test4] ;
mov [total], eax
sub eax,'0'
push total
call printf
add esp, 4
Пример прохождения:
./prg2b
enter a test score.
1
enter a test score.
1
enter a test score.
1
enter a test score.
1
41111
это дополнение к моему коду избавляет меня от моей проблемы с вызовом atof(), но оно успешно только в том случае, если числа представляют собой одну цифру, а общее количество равно ‹10.
Если бы кто-нибудь мог подсказать, как правильно использовать atof или как правильно преобразовать числа с плавающей запятой в программу, использующую scanf, это было бы очень признательно. Я очень новичок (читай: 2 недели обучения) в x86 asm. Это скомпилировано в терминале в системе UNIX.
add
— целочисленное сложение. Он не добавляет числа с плавающей запятой. Я ничего не знаю о материалах вашего курса, но, может быть, ваш профессор хотел, чтобы вы использовали инструкции x87 с плавающей запятой (или SSE)? Например, информацию о добавлении чисел с плавающей запятой в NASM с использованием x87 можно найти в примере внизу этих примеры - person Michael Petch   schedule 22.11.2015add
для сложения целых чисел. Я рекомендую прочитать ваш учебный материал, который, вероятно, включает информацию о таких инструкциях, как fild, для загрузки целого числа в стек FPU (преобразование его в число с плавающей запятой в процессе). Вы можете использовать fdiv (фидив может быть более подходящим), чтобы разделить на количество элементов. Много способов снять шкуру с этой кошки. Необходимо понимание операций с плавающей запятой. - person Michael Petch   schedule 22.11.2015