Почему моя гибридная (C ++, asm) программа выдает ошибку сегментации? - PullRequest
0 голосов
/ 05 апреля 2019

Ниже приведена программа сборки x86, предназначенная для сборки NASM под 64-битным CentOS через удаленный терминал, который не имеет gdb и также не позволяет устанавливать его.

main.cpp

#include <stdio.h>

extern "C" void looping_test();

int main(void)
{
    looping_test();

    return 0;
}

func.asm

extern printf

section .data
    hello:     db 'Hello World!', 20
    helloLen:  equ $-hello

section .text
    global  looping_test

looping_test:       ; print "Hello World" 5 times  

    mov ecx, 0; initialize the counter

    while_loop_lt:
        push    hello
        call    printf

        inc     ecx

        cmp     ecx, 4; This is exit control loop. 
        je  end_while_loop_lt

    end_while_loop_lt:

    ret

makefile

CC = g++
ASMBIN = nasm

all : asm cc link
asm : 
    $(ASMBIN) -o func.o -f elf -g -l func.lst func.asm
cc :
    $(CC) -m32 -c -g -O0 main.cpp &> errors.txt
link :
    $(CC) -m32 -g -o test main.o func.o
clean :
    rm *.o
    rm test
    rm errors.txt   
    rm func.lst

Вывод:

[me@my_remote_server basic-assm]$ make
nasm -o func.o -f elf -g -l func.lst func.asm
g++ -m32 -c -g -O0 main.cpp &> errors.txt
g++ -m32 -g -o test main.o func.o
[me@my_remote_server basic-assm]$ ./test
Segmentation fault
[me@my_remote_server basic-assm]$

Почему моя программа выдает ошибку сегментации?

1 Ответ

0 голосов
/ 05 апреля 2019

Я внес изменения в соответствии с комментариями @ MichaelPetch и @ PeterCordes 'и получил желаемый результат из следующего исходного кода:

func.asm

extern printf

section .data
    hello:     db "Hello World!", 20
    helloLen:  equ $-hello


section .text
    global  looping_test


looping_test:       ; print "Hello World" 5 times  

    mov ebx, 0  ; initialize the counter

    while_loop_lt:
        push    hello
        call    printf
        add     esp, 4

        inc     ebx

        cmp     ebx, 5          ; This is exit control loop. 
        je  end_while_loop_lt

        jmp     while_loop_lt   

    end_while_loop_lt:

    ret
...