Ensamblaje / Nasm: error de segmentación (núcleo volcado)

Soy muy nuevo en NASM y estoy tratando de ejecutar un ejemplo MASM en línea que encontré, pero ha sido un dolor traducirlo a NASM.

Compila y genera un archivo de salida correctamente, pero cuando intento ejecutarlo, aparece un error de segmentación (error de volcado del núcleo), que no tengo idea de qué es. El sistema operativo es Ubuntu, tratando de ejecutar la compilación en:

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

Aquí está el código:

%include "io.mac"

.DATA
PROMPT_1  DB  0DH,0AH,'Enter the first binary number ( max 8-digits ) : 

¡Gracias por la ayuda!

PROMPT_2 DB 0DH,0AH,'Enter the second binary number ( max 8-digits ) :

¡Gracias por la ayuda!

PROMPT_3 DB 0DH,0AH,'The SUM of given binary numbers in binary form is :

¡Gracias por la ayuda!

ILLEGAL DB 0DH,0AH,'Illegal character. Try again.

¡Gracias por la ayuda!

.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

¡Gracias por la ayuda!

Respuestas a la pregunta(1)

Su respuesta a la pregunta