2014-12-20 5 views
0

저는 NASM에 매우 익숙하며 발견 한 MASM 예제를 온라인에서 실행하려고 시도하고 있지만 NASM으로 통증이있었습니다.어셈블리/Nasm - 세그먼트 오류 (코어 덤프) 오류

출력 파일을 올바르게 컴파일하고 생성하지만 실행하려고하면 분할 오류 (코어 덤프 오류)가 발생합니다.이 분할 오류는 무엇인지 알지 못합니다. OS 아래에 컴파일 실행하려고, 우분투입니다 :

%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 

이 도움을 주셔서 감사합니다 :

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

코드입니다!

+0

어떻게 조립하려고합니까? 어떻게 그것을 실행하려고합니까? 어떤 운영 체제를 사용하고 있습니까? – icktoofay

+0

nasm -f elf binario.asm //// -m elf_i386 binario.o io.o -o binario //// 우분투는 게시 했어야합니다. 감사! – Kotoriii

답변

0

거기에있는 어셈블리 코드는 DOS 용이지만 ELF로 어셈블하고 우분투로 실행하려고합니다. NASM은 어느 방향 으로든 조립할 것입니다. (어셈블리를 기계 코드로 변환하는 일을하고 있지만) 우분투는 결과를 이해할 수 없습니다.

해당 코드를 실행하려면 NASM이 com 파일 확장명을 가진 플랫 바이너리를 어셈블 한 다음 DOSBox 또는 가상 컴퓨터 또는 다른 곳에서 실행하십시오.

+0

고맙습니다. Ubuntu와는 어떤 차이가 있습니까? 지금까지 내가 본 것처럼, 우분투에서 실행되는 NASM 예제는 다소 차이가 있지만 동일한 지침과 사물을 가지고 있습니다. 또한, 우분투에 맞게 편집 할 수있는 방법이 있습니까? 가상 머신없이 실행해야합니다. – Kotoriii

+0

@Kotoriii : 현재 사용하고있는 21H 인터럽트가 아닌 INT 80H를 통해 액세스하는 Linux 시스템 호출을 사용합니다. 하지만 당신은 그 숫자가 다른 레지스터에 있다고 기대하기 때문에 그 숫자를 대체 할 수 없습니다. 또한 DOS는 16 비트이고 Linux 응용 프로그램은 32 비트 또는 64 비트가 될 것입니다. – icktoofay

+0

로저! 고마워요 – Kotoriii

관련 문제