smiley_otter
smiley_otter

Reputation: 11

FASM win 64: program working with floating point operands

I have a university task to write a simple program in FASM win64 Assembler, which should calculate the following expression:

task

Where:

  • S - result;
  • A - constant 20 020 426;
  • B - some variable

The result of the program should be the message: "S is less/more than A"

We now work with float point numbers

I just can't understand how to divide and than subtract...

entry Start
include 'win64a.inc'

section '.data' data readable writeable

  A dd 20022604;
  B dd 1;
  mem1 dd 0
  log2 dd 1.1443;
  NULL = 0
  
  mes1 db 'S is greater than A', 0dh, 0ah, 0
  mes1Len = $ - mes1
  mes2 db 'S is less or equal to A', 0dh, 0ah, 0
  mes2Len = $ - mes2
  
  resStr db 'Result: %d', 0
  
  contitle db 'Results', 0
  hStdIn dd 0
  hStdOut dd 0
  chrsRead dd 0
  chrsWritten dd 0
  STD_INP_HNDL  dd -10
  STD_OUTP_HNDL dd -11

section '.bss' readable writeable 
  readBuf db ?

section '.idata' import data readable
    library kernel,'KERNEL32.DLL',\
      msvcrt, 'msvcrt.dll'
    
    import kernel,\
      SetConsoleTitleA, 'SetConsoleTitleA',\
      GetStdHandle, 'GetStdHandle',\
      WriteConsoleA, 'WriteConsoleA',\
      ReadConsoleA, 'ReadConsoleA',\
      ExitProcess, 'ExitProcess'
    
    import msvcrt,\
      puts,'puts',\
      scanf,'scanf',\
      printf,'printf',\ 
      exit,'exit',\
      getch, '_getch'


section '.code' code readable executable
Start:
    mov edx, 0
    mov eax, [A]
    mov ebx, 4
    
    div ebx 
    mov [mem1], edx

    mov edi, [log2];
    
    sub eax, edi;
    
    mov ebx, [B]
    
    mul ebx
    
    mov ebx, A
    
    cmp eax, ebx
    jg greater
    

    invoke GetStdHandle, [STD_OUTP_HNDL]
    mov [hStdOut], eax

    invoke GetStdHandle, [STD_INP_HNDL]
    mov [hStdIn], eax

    invoke WriteConsoleA, [hStdOut], mes2, mes2Len, chrsWritten, 0
    invoke ReadConsoleA, [hStdIn], readBuf, 1, chrsRead, 0

    jmp exit

greater:
    invoke GetStdHandle, [STD_OUTP_HNDL]
    mov [hStdOut], eax

    invoke GetStdHandle, [STD_INP_HNDL]
    mov [hStdIn], eax

    invoke WriteConsoleA, [hStdOut], mes1, mes1Len, chrsWritten, 0
    invoke ReadConsoleA, [hStdIn], readBuf, 1, chrsRead, 0
    



Exit:
  invoke ReadConsoleA, [hStdIn], readBuf, 1, chrsRead, 0
  invoke ExitProcess, 0 ``` 

What is the mistake?

Upvotes: 1

Views: 147

Answers (0)

Related Questions