组装/Nasm-分段错误(核心已转储)错误 [英] Assembly/Nasm - Segmentation fault (core dumped) error
问题描述
我对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屋!