0

Hi I am new to NASM and still familiarizing with the syntax. I have a problem running my code array.asm

This is my code: array.asm

%include "asm_io.inc"

segment .data

  msg1 : db "enter the number of elements of array : ", 10, 13
  len1 : equ $-msg1
  msg2 : db "enter the elements : ", 10, 13
  len2 : equ $-msg2
  msg3 : db "enter the element to be searched : ", 10, 13
  len3 : equ $-msg3
  msg4: db "element found at position : ", 10, 13
  len4: equ $-msg4
  msg5: db "element not found !! ", 10, 13
  len5: equ $-msg5
  
segment .bss

  inbuf resb 12

  no: resd 1
  no2: resd 1
  divide: resd 1
  dispcount: resd 1
  no_of_elements: resd 1
  array: resd 50
  temp: resd 1
  element: resd 1
  pos: resd 1



segment .text
  global _asm_main

_asm_main:
  mov eax, 4
  mov ebx, 1
  mov ecx, msg1
  mov edx, len1
  int 80h

 call getnumber

  mov eax, [no]
  mov [no_of_elements], eax

  mov eax, 4
  mov ebx, 1
  mov ecx, msg2
  mov edx, len2
  int 80h

  mov eax, [no_of_elements]
  mov [temp], eax


getarr:
  cmp dword [temp], 0
  je donegetno

  call getnumber

  mov eax, [no]
  push eax

 dec dword [temp]
  jmp getarr

  donegetno:

  mov eax, 4
  mov ebx, 1
  mov ecx, msg3
  mov edx, len3
  int 80h

 call getnumber

  mov eax, [no]
  mov [element], eax

  mov ebx, [no_of_elements]
  mov [temp], ebx


  search:
  pop eax

  mov [no], eax

  cmp [element], eax
  je found

  dec dword [temp]

  cmp dword [temp], 0
  jne search

  jmp notfound

  found :
   add dword [temp], 30h

  mov eax, 4
  mov ebx, 1
  mov ecx, msg4
  mov edx, len4
  int 80h

  mov eax, 4
  mov ebx, 1
  mov ecx, temp
  mov edx, 1
  int 80h

  mov dword [no], 10

  mov eax, 4
  mov ebx, 1
  mov ecx, no
  mov edx, 1
  int 80h

  jmp exit

  notfound :
  mov eax, 4
  mov ebx, 1
  mov ecx, msg5
  mov edx, len5
  int 80h

 exit:
 mov eax, 1
 mov ebx, 0
 int 80h


 getnumber:

 mov eax, 3
 mov ebx, 0
 mov ecx, inbuf
 mov edx, 11
 int 80h

 push inbuf
 call atoi
 add esp, 4

 mov dword [no], eax ; or could just return result in eax
 ret

 ;--------------------
 atoi:
 mov edx, [esp + 4] ; pointer to string
 xor eax, eax ; clear "result"
.top:
 movzx ecx, byte [edx]
 inc edx
 cmp ecx, byte '0'
 jb .done
 cmp ecx, byte '9'
 ja .done

    ; we have a valid character - multiply
    ; result-so-far by 10, subtract '0'
     ; from the character to convert it to
    ; a number, and add it to result.

 lea eax, [eax + eax * 4]
 lea eax, [eax * 2 + ecx - '0']

 jmp short .top
.done:
 ret

when I run my code at the terminal with these commands:

nasm -f win32 array.asm

gcc -o array array.obj driver.c asm_io.obj array

it doesn't return any error but the code is not running either. Can you please help me identify the issue? Thank you

Lee-Voug
  • 11
  • 2
  • There is no command that can build a working native Windows executable out of code that uses `int 80h` Linux system calls. You have the correct commands (assuming your GCC defaults to `-m32`), but the wrong source code for your OS. If you install WSL2, you could use `nasm -felf32 array.asm` / `gcc -m32 -no-pie array.o driver.c asm_io.o` inside WSL2. – Peter Cordes Aug 04 '22 at 02:56
  • How do you "know" it's not running? Did you single-step it with a debugger? I'd have expected `int 80h` to fault under Windows. – Peter Cordes Aug 04 '22 at 02:59
  • Is there a way to replace int80h with something that is more compatible with windows? – Lee-Voug Aug 04 '22 at 07:08
  • 1
    See the linked duplicates, such as [NASM tutorial uses int 80h, but this isn't working on Windows](https://stackoverflow.com/q/38269269). The Windows equivalent for read/write and exit system calls is `etStdHandle`/`WriteConsoleA` and `ExitProcess` as mentioned in [cannot run executable made by nasm in windows 7](https://stackoverflow.com/posts/comments/16860614) . See also [How to write hello world in assembler under Windows?](https://stackoverflow.com/q/1023593) – Peter Cordes Aug 04 '22 at 07:28

0 Answers0