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!