小编Dut*_*n18的帖子

nasm/ld“重新定位被截断以适应:R_386_16”

集会:

[BITS 16]

global _start

_start:
    mov ax, 0x07C0
    mov ds, ax

    mov si, hw
    call print_string
    jmp $

print_string:
    mov ah, 0x0E
.char:
    lodsb
    cmp al, 0
    je .exit
    int 0x10
    jmp .char
.exit: ret

times 0x100-($-$$) db 0

hw: db "Hello, World!", 0

times 510-($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

组装这个:

$ nasm file.asm -felf -o file.o
Run Code Online (Sandbox Code Playgroud)

然后将其与:

$ ld -melf_i386 -o file.bin file.o --oformat binary
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

file.asm:(.text+0x6): relocation truncated to fit: R_386_16 against `.text'
Run Code Online (Sandbox Code Playgroud)

在稍微摆弄代码后,我发现更改mov si, hw …

assembly nasm ld bootloader x86-16

6
推荐指数
1
解决办法
3967
查看次数

应该函数返回"新"对象

应该是一个函数返回指向堆上分配的内存的指针吗?

换句话说,下列哪种方法更"正确"?

// Method #1
Object* getObject1() {
    return new Object();
}

// Method #2
std::shared_ptr<Object> getObject2() {
    return std::make_shared<Object>();
}

int main() {
    // Usage of method #1
    Object* o1 = getObject1();
    o1->doSomething();
    delete o1; // object has to be deleted by user

    // Usage of method #2
    std::shared_ptr<Object>& o2 getObject2(); // has to be kept in shared_ptr
    o2.get()->doSomething();
    // object is deleted when o2 destructs
}
Run Code Online (Sandbox Code Playgroud)

我想第一种方法可能更快,但第二种方法不需要用户删除对象.

c++ pointers return function heap-memory

1
推荐指数
1
解决办法
5759
查看次数

标签 统计

assembly ×1

bootloader ×1

c++ ×1

function ×1

heap-memory ×1

ld ×1

nasm ×1

pointers ×1

return ×1

x86-16 ×1