Assembly / Nasm - 分段故障(核心转储)错误

时间:2014-12-20 02:43:35

标签: assembly nasm masm

我对NASM非常陌生,我试图在网上执行一个我发现的MASM示例,但是很难转化为NASM。

它正确编译并生成输出文件,但是当我尝试运行它时,它会产生分段错误(核心转储错误),我不知道它是什么。操作系统是Ubuntu,试图在:

下执行编译
nasm -f elf binario.asm
ld -m elf_i386 binario.o io.o -o binario

以下是代码:

%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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你所拥有的汇编代码适用于DOS,但是你将它汇编到ELF并试图用Ubuntu运行它。 NASM将以任何方式组装它(它正在完成它的工作,将程序集转换为机器代码),但是Ubuntu将无法理解结果。

如果要运行该代码,请让NASM组装一个带有com文件扩展名的平面二进制文件,然后在DOSBox或虚拟机中运行它。