У меня есть программа на MASM32, которая решает простую кусочно-определенную функцию. В псевдокоде это:Как напечатать массив на MASM32?
if (a > b) x = 2 + b/a
else if (a == b) x = 25
else x = (a - 5)/b
Я ввожу a, b, h и n. В программе цикла выполняется n шагов (a = a + h, x = ...) и записывается результат кусочного массива. Теперь я должен написать функцию для массива печати. Это код:
include \masm32\include\masm32rt.inc
.const
two dq 2.
five dq 5.
twfive dq 25.
enterA db "a: ", 0
enterB db "b: ", 0
enterH db "h: ", 0
enterN db "n: ", 0
InputFormat db "%lf", 0
InputNFormat db "%d", 0
OutputFormat db "%f", 10, 0
OutputFormatD db "%d", 10, 0
.data
.data?
a dq ?
b dq ?
h dq ?
n dd ?
tmp dq ?
l dd 0
arr dq 50 dup(0)
.code
main proc
FINIT ; init of coprocessor
invoke crt_printf, addr enterA
invoke crt_scanf, addr InputFormat, addr a
invoke crt_printf, addr enterB
invoke crt_scanf, addr InputFormat, addr b
invoke crt_printf, addr enterH
invoke crt_scanf, addr InputFormat, addr h
invoke crt_printf, addr enterN
invoke crt_scanf, addr InputNFormat, addr n
MOV ECX, n ; ECX = n = number of loop repetition
MOV EDI, 0 ; EDI = 0
FLD a ; ST(0) = a
cycle:
FCOM b ; compare a and b, result in SWR
; C2 = 1 => incomparable
; C0 = 1 => a < b
; C3 = 1 => a = b
; else => a > b
FSTSW AX ; SWR to AX
SAHF ; ZF = C3, PF = C2, CF = C0
JP incomparable
JC less
JZ equal
;else a > b:
FLD b ; ST(0) = b, ST(1) = a
FDIVR ; ST(0) = b/a
FADD two ; ST(0) = 2 + b/a
JMP endc
incomparable:
;
less:
FSUB five ; ST(0) = a - 5
FDIV b ; ST(0) = (a - 5)/b
JMP endc
equal:
FSTP tmp ; ST is empty
FLD twfive ; ST(0) = 25
JMP endc
endc:
FSTP arr[EDI]
ADD EDI, 8
ADD l, 1
FLD a ; ST(0) = a
FADD h ; ST(0) = a + h
FST a ; a = ST(0)
LOOP cycle
; all code above works perfect
; sodom and gomorrah will be here
inkey
invoke ExitProcess, NULL
main endp
end main
Итак, сначала я пытался написать функцию, но у меня были проблемы с передачей параметров на нее. Я решил попробовать поставить смещение для регистрации, нажать на стек, затем поместить его и напечатать (по крайней мере) первый элемент массива. Но у меня много ошибок.
MOV EDI, offset arr ; move offset of array to EDI
XOR ECX, ECX ; clear ECX (but not increment yet)
PUSH QWORD [EDI + ECX * 8] ; found this solution (but with dword, not qword)
POP QWORD [tmp] ; on stackoverflow, but it is not working :c
invoke crt_printf, addr OutputFormat, tmp
Тогда я попытался заменить толчок/поп-операции мов:
MOV [tmp], [EDI + ECX * 4]
Ничего. И я не могу использовать только регистры, потому что я использую DQ (регистры afaik - 32-разрядные, DQ-64-разрядные).
Я пробовал много способов (например, FLD/FSTP), но у меня есть только ошибки сборки или неправильный вывод. Не могли бы вы сказать мне правильное решение?
Большое спасибо за объяснение! Я выбираю последний способ. –