组装/Nasm-分段错误(核心已转储)错误 [英] Assembly/Nasm - Segmentation fault (core dumped) error

查看:138
本文介绍了组装/Nasm-分段错误(核心已转储)错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对NASM还是陌生的,我正在尝试在线执行我发现的MASM示例,但是这会给NASM带来痛苦.

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.

它可以正确编译并生成一个输出文件,但是当我尝试运行它时,会出现分段错误(核心转储错误),我不知道它是什么.操作系统是Ubuntu,试图在以下位置执行编译:

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

这是代码:

%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

谢谢您的帮助!

推荐答案

您已经获得了用于DOS的汇编代码,但是您正在将其汇编为ELF并尝试在Ubuntu上运行. NASM会以任何一种方式进行组装(正在完成工作,将组装转换为机器代码),但是Ubuntu无法理解结果.

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.

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

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.

这篇关于组装/Nasm-分段错误(核心已转储)错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆