Articles of nasm

Linux x86引导程序

我正在尝试在nasm中构build一个简单的x86 Linux引导程序。 Linux bzImage从第一个扇区开始存储在磁盘分区sda1上。 我从bzImage(15个扇区)将实模式代码从0x7E00开始读入内存。 但是,当我跳进代码只是挂起,没有任何反应。 我已经在sda上创build了主引导logging的代码。 我可能是最好的,如果我只附加整个事情。 我想知道为什么它挂在远跳转指令后。 [BITS 16] %define BOOTSEG 0x7C0 %define BOOTADDR (BOOTSEG * 0x10) %define HDRSEG (BOOTSEG + 0x20) %define HDRADDR (HDRSEG * 0x10) %define KERNSEG (HDRSEG + 0x20) [ORG BOOTADDR] entry_section: cli jmp start start: ; Clear segments xor ax, ax mov ds, ax mov es, ax mov gs, […]

x86汇编中堆栈alignment的责任

我试图清楚地了解谁(调用者或被调用者)负责堆栈alignment。 64位程序集的情况相当清楚,它是由调用者 。 参考系统V AMD64 ABI,3.2.2部分堆栈帧 : input参数区域的末尾应该alignment在一个16(32,如果__m256传入堆栈)字节边界。 换句话说,假设对于被调用函数的每个入口点都应该是安全的: 16 | (%rsp + 8) (额外八是因为call隐式地将返回地址压栈)。 它如何看起来在32位世界(假设cdecl)? 我注意到gcc把调用放在被调用的函数里面 ,如下所示: and esp, -16 这似乎表明,这是被调查人的责任。 说得更清楚,请考虑以下代码: global main extern printf extern scanf section .rodata s_fmt db "%d %d", 0 s_res db `%d with remainder %d\n`, 0 section .text main: start 0, 0 sub esp, 8 mov DWORD [ebp-4], […]

在NASM Linux中strlen

再对不起 我正在尝试了解汇编languaje。 但是我有很多问题。 我正在尝试使用NASM中的string。 我有一个string常量复制到stringvariables。 最大的大小是50.所以我想validation这个界限。 但是这个程序抛出了一个分段错误。 我在MASM中使用了一个例子,所以在NASM语法中可能存在一个使用错误。 我的程序如下: section .data MAXTEXTSIZE equ 50 _cte_hola db "Hola", 0 _cte_mundo db "Mundo", 0 section .bss MAIN_d resb MAXTEXTSIZE+1 section .text global _start strlen: mov bx, 0 strl01: cmp WORD [SI+BX],0 t je strend inc bx jmp strl01 strend: ret strcpy: call strlen cmp bx, MAXTEXTSIZE jle […]

汇编/链接与nasm和ld的问题

我有一个与nasm编译的示例程序集文件: nasm -f elf syscall.asm 这会生成一个syscall.o文件。 我尝试链接它与ld: ld -o syscall syscall.o ld命令失败,出现以下错误: ld: i386 architecture of input file `syscall.o' is incompatible with i386:x86-64 output 但是,如果我这样做 ld -o syscall syscall.o -melf_i386 该命令成功,我得到一个系统调用可执行文件。 确定nasm不是以x86-64格式生成目标代码我在syscall.asm文件的开头添加了“BITS 64”指令。 然后尝试组装syscall.asm与nasm给出了以下错误: error: elf output format does not support 64-bit code 这似乎很奇怪,因为在我的terminal上执行“file / usr / bin / nasm”会给出: /usr/bin/nasm: ELF 64-bit LSB executable, […]

无法运行与libc链接的可执行文件

我用下面的命令组装我的Hello World: nasm -f elf64 test.asm 然后我与这个链接: ld -s test.o -lc 我知道这是有效的,因为file a.out显示我 a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped 但是,当我运行与./a.out这个我得到bash: ./a.out: No such file or directory 当没有libc链接它运行良好! 我怎样才能让我的libc链接EXE运行?

系统调用很好的参考

我需要一些参考,但很好,可能有一些很好的例子。 我需要它,因为我正在开始使用NASM汇编程序在程序集中编写代码。 我有这个参考: http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html 这是相当不错的和有用的,但它有很多的限制,因为它没有解释其他寄存器中的字段。 例如,如果我正在使用写入系统调用,我知道我应该把1放在EAX寄存器中,ECX可能是一个指向string的指针,但EBX和EDX呢? 我希望能够解释一下,EBX决定input(0表示stdin,1表示其他东西),EDX是要input的string的长度等等。我希望你能理解我想要什么,我找不到任何这样的材料,所以我就写在这里。 提前致谢。

string常量中的新行字符不被nasm识别

我正在使用汇编编写一个'Hello world'程序。 我已经在每个string的末尾用新行字符\n声明了2个string常量: section .data str1: db "abcd\n" str2: db "efgh\n" section .text global _start _start: mov rax, 1 mov rdi, 1 mov rsi, str1 mov rdx, 6 syscall mov rax, 1 mov rdi, 1 mov rsi, str2 mov rdx, 6 syscall mov rax, 60 mov rdi, 0 syscall 在我build立并执行了这个代码之后,我得到了以下结果: $ nasm -f elf64 -o […]

GDB抱怨没有可用的源代码

我在Ubuntu 12.10 64位上运行。 我想在GDB中debugging一个简单的汇编程序。 但是GDB的gui模式(-tui)似乎无法find我的程序集文件的源代码。 我已经在当前的目录中重build了这个项目,并search了谷歌无济于事,请帮助我在这里。 我的命令: nasm -f elf64 -g -F dwarf hello.asm gcc -g hello.o -o hello gdb -tui hello debugging信息似乎被加载,我可以在main()中设置一个断点,但屏幕的上半部分仍然会显示' [No Source Available] '。 如果你感兴趣,这里是hello.asm: ; hello.asm a first program for nasm for Linux, Intel, gcc ; ; assemble: nasm -f elf -l hello.lst hello.asm ; link: gcc -o hello hello.o ; […]

在x86 nasm中分割时浮点exception

我忙于学习大会,看着分裂,但我遇到了一个泡菜,下面的声明: mov edx,0x00000001 mov eax,0x00000000 mov ecx,0x00000002 idiv ecx GDB: 0x08048071 <+17>: mov edx,0x1 0x08048076 <+22>: mov eax,0x0 0x0804807b <+27>: mov ecx,0x2 => 0x08048080 <+32>: idiv ecx 我想通过0x00000002来划分0x100000000,所以既然划分的范围是EDX:EAX,我把0x1移到EDX和0x0到EAX。 然后,我将0x2移到ECX中,然后除法,这不幸给了我一个浮点exception,我不知道我做错了什么。 当使用div(无符号)它正常工作,所以我想知道是什么区别是在div和idiv之间的解释导致exception这个特定的陈述。

在Ubuntu上运行汇编代码

我试图运行的代码是波纹pipe。 我使用nasm util将其转换为目标文件。 当我试图执行它说“不能执行二进制文件”。 我运行命令:nasm -f elf -o helloworld.o helloworld.asm segment .data msg db "Hello, world!",10 len equ $ – msg segment .text global _start _start: mov eax,4 mov ebx,1 mov ecx,msg mov edx,len int 80h mov eax,1 mov ebx,0 int 80h 这是我在程序集中的第一个程序,除了编译一些外,我没有使用ubuntu 基本的C程序。 我需要一些帮助,谢谢大家。