Search code examples
assemblynasmmasm

Assembly/Nasm - Segmentation fault (core dumped) error


I'm very new to NASM and I'm trying to execute a MASM example online that I found, but has been a pain translating to NASM.

It compiles and generates an output file correctly, but when I try to run it, it gives a Segmentation fault (core dumped error), which I have no idea what it is. OS is Ubuntu, trying to execute compiling under:

nasm -f elf binario.asm
ld -m elf_i386 binario.o io.o -o binario

Here is the code:

%include "io.mac"

.DATA
PROMPT_1  DB  0DH,0AH,'Enter the first binary number ( max 8-digits ) : $'
PROMPT_2  DB  0DH,0AH,'Enter the second binary number ( max 8-digits ) : $'
PROMPT_3  DB  0DH,0AH,'The SUM of given binary numbers in binary form is : $'
ILLEGAL   DB  0DH,0AH,'Illegal character. Try again.$'

.CODE
.STARTUP

 JMP start2                ; jump to label @START_2

 start1:                    ; jump label
   MOV DX, [ILLEGAL]            ; load and display the string ILLEGAL 
   MOV AH, 9
   INT 21H

 start2:                    ; jump label
   XOR BX, BX                 ; clear BX

   MOV DX, [PROMPT_1]           ; load and display the string PROMPT_1
   MOV AH, 9
   INT 21H

   MOV CX, 8                  ; initialize loop counter
   MOV AH, 1                  ; set input function

   loop1:                   ; loop label
     INT 21H                  ; read a character

     CMP AL, 0DH              ; compare AL with CR
     JNE skip1              ; jump to label @SKIP_1 if AL!=0DH

     CMP CX, 8                ; compare CX with 8
     JE start1              ; jump to label @START_1 if CX=8
     JMP exitloop1         ; jump to label @EXIT_LOOP_1

    skip1:                 ; jump label
       AND AL, 0FH            ; convert ascii into decimal code
       SHL BL, 1              ; shift BL towards left by 1 position
       OR BL, AL              ; set the LSB of BL with LASB of AL
   LOOP loop1              ; jump to label @LOOP_1 if CX!=0

   exitloop1:              ; jump label

   MOV DX, [PROMPT_2]           ; load and display the string PROMPT_2
   MOV AH, 9
   INT 21H

   MOV CX, 8                  ; initialize loop counter
   MOV AH, 1                  ; set input function

   loop2:                   ; loop label
     INT 21H                  ; read a character

     CMP AL, 0DH              ; compare AL with CR
     JNE skip2              ; jump to label @SKIP_2 if AL!=0DH

     CMP CX, 8                ; compare CX with 8
     JE start2             ; jump to label @START_2 if CX=8
     JMP exitloop2        ; jump to label @EXIT_LOOP_2

     skip2:                 ; jump label
       AND AL, 0FH            ; convert ascii into decimal code
       SHL BH, 1              ; shift BH towards left by 1 position
       OR BH, AL              ; set the LSB of BH with LASB of AL
   LOOP loop2              ; jump to label @LOOP_2 if CX!=0

   exitloop2:              ; jump label

   MOV DX, [PROMPT_3]           ; load and display the string PROMPT_3
   MOV AH, 9
   INT 21H

   ADD BL, BH                 ; add BL and BH
   JNC skip                  ; jump to label @SKIP if CF=1
     MOV AH, 2                ; print the digit 1 i.e. carry
     MOV DL, 31H
     INT 21H

   skip:                     ; jump label

   MOV CX, 8                  ; initialize loop counter
   MOV AH, 2                  ; set output function

   loop3:                   ; loop label
     SHL BL, 1                ; shift BL towards left by 1 position
     JC one                  ; jump to label @ONE if CF=1
     MOV DL, 30H              ; set DL=0
     JMP display            ; jump to label @DISPLAY

     one:                    ; jump label
       MOV DL, 31H            ; set DL=1

     display:                ; jump label
       INT 21H                ; print the character
   LOOP loop3              ; jump to label @LOOP_3 if CX!=0

 MOV AH, 4CH                  ; return control to DOS
 INT 21H

done:
.EXIT

Thank you for the help!


Solution

  • The assembly code you’ve got there is for DOS, but you’re assembling it to an ELF and trying to run it with Ubuntu. NASM will assemble it either way (it’s doing its job, converting the assembly to machine code), but Ubuntu won’t be able to understand the result.

    If you want to run that code, have NASM assemble a flat binary with a com file extension, and then run it in DOSBox or a virtual machine or something.