相关疑难解决方法(0)

如何反汇编原始x86代码?

我想拆解我的可启动x86磁盘的MBR(前512字节).我已经将MBR复制到了一个文件中

dd if=/dev/my-device of=mbr bs=512 count=1
Run Code Online (Sandbox Code Playgroud)

对可以反汇编文件的Linux实用程序的任何建议mbr

linux x86 assembly mbr x86-16

87
推荐指数
6
解决办法
7万
查看次数

如何使用GNU GAS汇编程序生成像nasm -f bin这样的普通二进制文件?

我有一些通常具有以下结构的NASM文件:

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret
Run Code Online (Sandbox Code Playgroud)

我正在组装它们:

nasm -f bin abc.asm
Run Code Online (Sandbox Code Playgroud)

我想用GAS写一些这些.两个问题:

  • 我应该在GAS中使用哪些指令?我找到了'.org'指令,但GAS似乎没有'.bits'指令.

  • 我应该传递什么gccas生成一个普通的二进制文件?即-f binNASM 的选项是什么.

assembly gnu-assembler nasm

21
推荐指数
2
解决办法
1万
查看次数

如何在GDB中使用特定操作码中断指令?

我有一些代码的汇编代码,将在程序中的某个点执行.我不知道内存中代码的地址.

当前指令与输入指令匹配时,是否可以使gdb中断?

例如,每当gdb到达此指令时,我希望gdb中断:

leaq        0x000008eb(%rip),%rax
Run Code Online (Sandbox Code Playgroud)

debugging gdb breakpoints

7
推荐指数
2
解决办法
5101
查看次数

我应该制作自己的操作系统内核ELF还是原始二进制文件?

我已经开始了我的OS开发之旅.人们通常会大声说使用原始二进制而不是ELF(或其他结构化格式)是自定义操作系统中应用程序的常见错误.我可以说,因为ELF提供了额外的好处(存储元信息的地方,如符号表,.debug和.line).但是,让我们考虑内核二进制本身一分钟.它应该是结构化的(如ELF),如果是,为什么?否则写一个ELF加载器并在stage1加载器之后立即挤压它似乎是浪费.

AFAIK Linux内核是一个ELF文件,但我不知道原因.

operating-system kernel elf osdev bootloader

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

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
查看次数

使用gdb和QEMU调试bootloader/bios时如何跳过中断调用?

出于教育目的,我已经从mikeos.berlios.de/write-your-own-os.html改编了这个引导加载程序,将其重写为专门加载地址0x7c00.

最终的代码是这样的:

[BITS 16]           ; Tells nasm to build 16 bits code
[ORG 0x7C00]        ; The address the code will start

start: 
    mov ax, 0       ; Reserves 4Kbytes after the bootloader
    add ax, 288 ; (4096 + 512)/ 16 bytes per paragraph 
    mov ss, ax 
    mov sp, 4096 
mov ax, 0   ; Sets the data segment 
    mov ds, ax 
    mov si, texto   ; Sets the text position 
    call imprime    ; Calls the printing routine
jmp $       ; Infinite …
Run Code Online (Sandbox Code Playgroud)

assembly gdb qemu bootloader

5
推荐指数
2
解决办法
2458
查看次数

如何从目标文件生成纯二进制文件?

我应该如何从两个对象(.o)文件生成原始二进制文件?

我想要nasm -f bin在编译.asm文件时生成的纯二进制格式,但是对于.o文件.

通过一个简单的二进制文件,我的意思是只包含的说明,而不是一些额外的信息,尽可能多的可执行文件包含了很多额外的有用信息的文件.

有关该信息,请参见http://www.nasm.us/doc/nasmdoc7.html.

PS:我想在QEMU中制作一个"普通二进制" .

c gcc binaryfiles ld

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

如何在16位模式下使用GDB?

我有以下代码,我试图实现一个使用BIOS函数打印字符串的函数:

int printString(char* string)
{
 int i = 0;
 while (*(string + i) != '\0')
   {
    char al = *(string + i);
    char ah = 0xe;
    int ax = ah * 256 + al;
    interrupt(0x10,ax,0,0,0);
    i++;
   }
 return i;
}
Run Code Online (Sandbox Code Playgroud)

函数中断在汇编中实现.它调用适当的BIOS中断,如第一个参数所给出的,其余参数分别包含ax,bx,cx和dx寄存器的内容:

.global _interrupt
_interrupt:
push bp
mov bp, sp
push si
push ds
mov ax, #0x100
mov ds, ax
mov ax, [bp + 0x4]
mov si, #intr
mov [si + 1], al
pop ds
mov ax, [bp + 0x6]
mov …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gdb

4
推荐指数
2
解决办法
2879
查看次数

QEMU gdb 不显示固件说明

我正在尝试调试 QEMU 模拟器附带的 bios.bin。我按如下方式启动 QEMU:

qemu-system-x86_64 -bios bios.bin -s -S
Run Code Online (Sandbox Code Playgroud)

然后我开始调试:

gdb
target remote localhost:1234
Run Code Online (Sandbox Code Playgroud)

GDB 处于 Intel 切换状态 0xffffffff0 现在固件/BIOS 应该在的位置。但是,内存中此位置没有任何内容。即使通过更多指令单步执行,nexti它也会解码为全零。

我做错了什么还是我误解了什么?我基本上想获得 cpu 调用的第一条指令并从那里继续调试。

debugging x86 gdb qemu bios

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