2014-12-19 3 views
1

У меня есть программа на 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), но у меня есть только ошибки сборки или неправильный вывод. Не могли бы вы сказать мне правильное решение?

ответ

0

PUSH/POP r/m64 не действителен в 32-битном режиме (даже если бы это было так, правильный синтаксис MASM был бы QWORD PTR [..., а не только QWORD [...).

Но есть и другие способы, чтобы переместить данные:

  • Вы можете использовать два PUSH DWORD PTR инструкции, каждый толкать половину данных, а затем два POP DWORD PTR инструкции совать данные на место.

  • Вы можете использовать MOVQ инструкцию для передачи данных через регистр MMX (вам нужно добавить .mmx директиву к началу файла сборки для этого собрать):

    movq mm0,[EDI + ECX * 8]
    movq [tmp],mm0
    emms

  • Вы можете перемещать данные с помощью FPU:

    fld QWORD PTR [EDI + ECX * 8]
    fstp QWORD PTR [tmp]

+0

Большое спасибо за объяснение! Я выбираю последний способ. –

 Смежные вопросы

  • Нет связанных вопросов^_^