2
I’m trying to do this operation (y = 0.299*red + 0.587*green + 0.114*blue) in Assembly mode protected nasm integrating c with Assembly in windows, but regardless of the input values the result is always 0.
extern printf ;a função printf em C é chamada
extern scanf ;a função scanf em C é chamada
SECTION .data
msg1 db "Pixel vai ficar preto!", 10,0
msg2 db "Pixel vai ficar branco!", 10,0
msg3 db "Digite os valores para as cores vermelho, verde e azul:", 10,0
scan db "%d", 0
;msg4 db "Os numeros sao %d, %d, %d", 0
msg5 db "valor final %.3f",10,0
constante1 dd 0.299
constante2 dd 0.587
constante3 dd 0.114
constante4 dd 0.713
constante5 dd 128
constante6 dd 0.564
;y dw 0
SECTION .bss
red resd 1
green resd 1
blue resd 1
y resd 1
cr resd 1
cb resd 1
SECTION .text
_start:
push msg3
call printf
add esp, 4
;pega o valor de vermelho
push red
push scan
call scanf
add esp, 8
;pega o valor de verde
push green
push scan
call scanf
add esp, 8
;pega o valor de azul
push blue
push scan
call scanf
add esp, 8
;imprime os valores lidos (só pra teste)
;push dword[blue]
;push dword[green]
;push dword[red]
;push msg4
;call printf
;add esp, 16
calcula_y:
fld dword[red] ;coloca na pilha o valor de red
fld dword[constante1] ;coloca na pilha o valor da constate1
fmulp st1,st0 ;faz a multiplicação e salva em st1
fld dword[green] ;coloca na pilha o valor de green
fld dword[constante2] ;coloca na pilha o valor da constate2
fmulp st1,st0 ;faz a multiplicação e salva em st1
fld dword[blue] ;coloca na pilha o valor de blue
fld dword[constante3] ;coloca na pilha o valor da constate3
fmulp st1,st0 ;faz a multiplicação e salva em st1
faddp st1, st0 ;faz a adição de st1 e st0 e salva em st1 e dá um pop em st0
fadd st1 ;faz a adição de st1 e st0 e salva em st0
fst dword[y] ;pega o valor st0 e coloca em y
push dword[y+4]
push dword[y]
push msg5
call printf
add esp, 12
ret