Please help. Write now this program is running in 64 bit and I need to convert i
ID: 3808545 • Letter: P
Question
Please help. Write now this program is running in 64 bit and I need to convert it to where it runs in 32 bit. Thanks!
%include "along32.inc"
default rel
section .data
msga db "a = ", 0 ;read a
msgb db "b = ", 0 ;read b
msgc db "c = ", 0 ;read c
msg1 db "x = ", 0 ;x
errmsg db "invalid arguments.", 10, 13, 0 ;wrong input
a dq 0 ;initialize a
b dq 0 ;initialize b
c dq 0 ;initialize c
zero dq 0.0 ;0 valid
two dq 2.0 ; decimal point valid
negone dq -1.0 ;negative valid
four dq 4.0 ;dec
x1 dq 0
x2 dq 0
section .text
global main ;main
main:
mov edx, msga ;move a into rdx register
call WriteString ;call writer
call ReadFloat ;read floating points
movdqu [a], xmm0 ;a == input1
mov edx, msgb ;move b to register rdx
call WriteString ;call writer
call ReadFloat ;read floating points
movdqu [b], xmm0 ; b == input2
mov edx, msgc ;move c into rdx register
call WriteString ;call writer
call ReadFloat ;read floating points
movdqu [c], xmm0 ; c == input3
movdqu xmm8, [zero] ;xmm8 = 0
movdqu xmm10, [b] ; xmm10 = b
movdqu xmm7, [negone] ; xmm7 = -1
mulsd xmm10, xmm7 ; xmm10 = -b
movdqu xmm11, [b] ; xmm11 = b
mulsd xmm11, xmm11 ; xmm11 = b^2
movdqu xmm12, [a] ; xmm12 = a
movdqu xmm1, [c] ;xmm1 = c
movdqu xmm7, [four] ; xmm7 = 4
mulsd xmm12, xmm7 ; xmm12 = 4a
mulsd xmm12, xmm1 ; xmm12 = 4ac
subsd xmm11, xmm12 ; xmm11 = b^2 - 4ac
ucomisd xmm11, xmm8 ;unorder compared
jnb good ;jump if inputs are correct
error:
mov edx, errmsg ;move error messga
call WriteString ;string writer
call ExitProc ;exit
good:
sqrtsd xmm11, xmm11 ; xmm11 = sqrt(b^2 - 4ac)
movdqu xmm13, [a] ; xmm13 = a
movdqu xmm7, [two] ; xmm7 = 2
mulsd xmm13, xmm7 ; xmm13 = 2a
ucomisd xmm13, xmm8 ;xmm13 =
je zeroA
movsd xmm14, xmm10 ; xmm14 = -b
addsd xmm14, xmm11 ; xmm14 = -b + sqrt(b^2-4ac)
divsd xmm14, xmm13 ; xmm14 = xmm14 / 2a
movdqu [x1], xmm14 ; x1 = xmm14
movsd xmm15, xmm10 ; xmm15 = -b
subsd xmm15, xmm11 ; xmm15 = -b - sqrt(b^2-4ac)
divsd xmm15, xmm13 ; xmm15 = xmm15 / 2a
movdqu [x2], xmm15 ; x2 = xmm15
mov edx, msg1 ;move x
call WriteString ; write "x = "
movdqu xmm0, [x1] ; xmm0 = x1
call WriteFloat ; write x1
call Crlf ; reset cursor
call WriteString ; write "x = "
movdqu xmm0, [x2] ; xmm0 = x2
call WriteFloat ; write x2
call Crlf ; reset cursor
call ExitProc ; exit program
zeroA:
movdqu xmm10, [b] ;xmm10=b
movdqu xmm11, [c] ;xmm11=c
movdqu xmm12, [negone] ;register negative reader
mulsd xmm11, xmm12 ;xmm11=xmm12
divsd xmm11, xmm10 ;xmm10=xmm10
movsd xmm0, xmm11 ;xmm0=xmm11
mov edx, msg1 ; print x
call WriteString ;write string
call WriteFloat ;write float
call Crlf ;reset cursor
call ExitProc ;exit
Explanation / Answer
nclude "along32.inc"
default rel
section .data
msga db "a = ", 0 ;read a
msgb db "b = ", 0 ;read b
msgc db "c = ", 0 ;read c
msg1 db "x = ", 0 ;x
errmsg db "invalid arguments.", 10, 13, 0 ;wrong input
a dq 0 ;initialize a
b dq 0 ;initialize b
c dq 0 ;initialize c
zero dq 0.0 ;0 valid
two dq 2.0 ; decimal point valid
negone dq -1.0 ;negative valid
four dq 4.0 ;dec
x1 dq 0
x2 dq 0
section .text
global main ;main
main:
mov edx, msga ;move a into rdx register
call WriteString ;call writer
call ReadFloat ;read floating points
movdqu [a], xmm0 ;a == input1
mov edx, msgb ;move b to register rdx
call WriteString ;call writer
call ReadFloat ;read floating points
movdqu [b], xmm0 ; b == input2
mov edx, msgc ;move c into rdx register
call WriteString ;call writer
call ReadFloat ;read floating points
movdqu [c], xmm0 ; c == input3
movdqu xmm8, [zero] ;xmm8 = 0
movdqu xmm10, [b] ; xmm10 = b
movdqu xmm7, [negone] ; xmm7 = -1
mulsd xmm10, xmm7 ; xmm10 = -b
movdqu xmm11, [b] ; xmm11 = b
mulsd xmm11, xmm11 ; xmm11 = b^2
movdqu xmm12, [a] ; xmm12 = a
movdqu xmm1, [c] ;xmm1 = c
movdqu xmm7, [four] ; xmm7 = 4
mulsd xmm12, xmm7 ; xmm12 = 4a
mulsd xmm12, xmm1 ; xmm12 = 4ac
subsd xmm11, xmm12 ; xmm11 = b^2 - 4ac
ucomisd xmm11, xmm8 ;unorder compared
jnb good ;jump if inputs are correct
error:
mov edx, errmsg ;move error messga
call WriteString ;string writer
call ExitProc ;exit
good:
sqrtsd xmm11, xmm11 ; xmm11 = sqrt(b^2 - 4ac)
movdqu xmm13, [a] ; xmm13 = a
movdqu xmm7, [two] ; xmm7 = 2
mulsd xmm13, xmm7 ; xmm13 = 2a
ucomisd xmm13, xmm8 ;xmm13 =
je zeroA
movsd xmm14, xmm10 ; xmm14 = -b
addsd xmm14, xmm11 ; xmm14 = -b + sqrt(b^2-4ac)
divsd xmm14, xmm13 ; xmm14 = xmm14 / 2a
movdqu [x1], xmm14 ; x1 = xmm14
movsd xmm15, xmm10 ; xmm15 = -b
subsd xmm15, xmm11 ; xmm15 = -b - sqrt(b^2-4ac)
divsd xmm15, xmm13 ; xmm15 = xmm15 / 2a
movdqu [x2], xmm15 ; x2 = xmm15
mov edx, msg1 ;move x
call WriteString ; write "x = "
movdqu xmm0, [x1] ; xmm0 = x1
call WriteFloat ; write x1
call Crlf ; reset cursor
call WriteString ; write "x = "
movdqu xmm0, [x2] ; xmm0 = x2
call WriteFloat ; write x2
call Crlf ; reset cursor
call ExitProc ; exit program
zeroA:
movdqu xmm10, [b] ;xmm10=b
movdqu xmm11, [c] ;xmm11=c
movdqu xmm12, [negone] ;register negative reader
mulsd xmm11, xmm12 ;xmm11=xmm12
divsd xmm11, xmm10 ;xmm10=xmm10
movsd xmm0, xmm11 ;xmm0=xmm11
mov edx, msg1 ; print x
call WriteString ;write string
call WriteFloat ;write float
call Crlf ;reset cursor
call ExitProc ;exit