我想拆解我的可启动x86磁盘的MBR(前512字节).我已经将MBR复制到了一个文件中
dd if=/dev/my-device of=mbr bs=512 count=1
Run Code Online (Sandbox Code Playgroud)
对可以反汇编文件的Linux实用程序的任何建议mbr?
我有一些通常具有以下结构的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'指令.
我应该传递什么gcc或as生成一个普通的二进制文件?即-f binNASM 的选项是什么.
我有一些代码的汇编代码,将在程序中的某个点执行.我不知道内存中代码的地址.
当前指令与输入指令匹配时,是否可以使gdb中断?
例如,每当gdb到达此指令时,我希望gdb中断:
leaq 0x000008eb(%rip),%rax
Run Code Online (Sandbox Code Playgroud) 我已经开始了我的OS开发之旅.人们通常会大声说使用原始二进制而不是ELF(或其他结构化格式)是自定义操作系统中应用程序的常见错误.我可以说,因为ELF提供了额外的好处(存储元信息的地方,如符号表,.debug和.line).但是,让我们考虑内核二进制本身一分钟.它应该是结构化的(如ELF),如果是,为什么?否则写一个ELF加载器并在stage1加载器之后立即挤压它似乎是浪费.
AFAIK Linux内核是一个ELF文件,但我不知道原因.
集会:
[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 …
出于教育目的,我已经从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) 我应该如何从两个对象(.o)文件生成原始二进制文件?
我想要nasm -f bin在编译.asm文件时生成的纯二进制格式,但是对于.o文件.
通过一个简单的二进制文件,我的意思是只包含的说明,而不是一些额外的信息,尽可能多的可执行文件包含了很多额外的有用信息的文件.
有关该信息,请参见http://www.nasm.us/doc/nasmdoc7.html.
PS:我想在QEMU中制作一个"普通二进制" .
我有以下代码,我试图实现一个使用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) 我正在尝试调试 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 调用的第一条指令并从那里继续调试。