Articles of 程序集

为什么Linux在执行上下文切换时保存%ebp?

在进行上下文切换时,x86 Linux(非常巧妙地)避免了保存和恢复EAX,EBX,ECX,EDX,ESI和EDI。 当然,切换到内核模式时,用户等级值保存在内核堆栈中。 但是内核代码中的值不会被保存,而是使用GCC指令来告诉编译器不要在交换机发生的地方保留这些寄存器所需的任何值。 自然,ESP必须被保存和恢复。 但这是我不明白的:在ESP切换之前,EBP被推入内核堆栈。 我认为EBP被用作帧指针,但在我的内核debugging器中,值肯定不是这样的: (gdb) print $esp $22 = (void *) 0xc0025ec0 (gdb) print $ebp $23 = (void *) 0xcf827f3c EBP在这里是一个框架指针的区别太大了。 在代码中的评论说,“EBP是显式保存/恢复wchan访问”,但我正在寻找代码,并不能弄清楚是怎么回事。 谷歌也没有帮助。 一些内核向导可以进来帮忙吗?

将Linux x86-64程序集hello world程序与ld链接失败

我一直在最近在linux上玩x86 64位程序集,然后在编译一个看起来很简单的程序后,我留下了我的脑袋:P 虽然我编译和链接它没有引发错误,并产生一个Linux ELF当我尝试运行它,我得到: .:[ h4unt3r@sp3ctr4l-h0st asm ]:. #(0)> ./hello bash: ./hello: No such file or directory 我假设它产生一个无效的ELF文件,这就是为什么它报告你不在那里,即使它是。 不知道为什么 – 我可能会继续玩它,只是好奇,如果这可以轻松解决^ _ ^ 这是我的编译/链接命令行: nasm -f elf64 hello.s -g ld -o hello hello.o -lc 这里是代码: section .data msg: db "Hello, world!",0xa,0 section .text extern printf global main main: push rbp mov rbp, rsp mov rdi, […]

内存在variables赋值之前不包含垃圾

我有一个简单的C程序: #include <stdio.h> int main() { int i; for(i = 0; i < 10; i++) printf("Hello\n"); return 0; } 我使用gcc编译它: gcc -g test.c 然后我运行debugging器: gdb -q ./a.out 我在main中设置了一个断点并运行: (gdb) break main (gdb) run 然后让它运行,直到遇到断点,并试图在rip当前指向的地址上显示汇编指令: (gdb) x/i $rip => 0x400538 <main+8>: mov DWORD PTR [rbp-0x4],0x0 它看起来像下一个指令将初始化我的本地variables我的值为0.由于它还没有执行的指令,我希望有一个垃圾值在那里。 (gdb) x/4xb $rbp-4 0x7fffffffe0ec: 0x00 0x00 0x00 0x00 它看起来不像垃圾值,看起来所有的东西都已经被清零了。 在执行main中的任何代码之前,断点应该暂停程序。 […]

用gcc编译和运行程序集的最小例子?

int main(int argc, char* argv[]) { return 0; } gcc编译成可执行文件的最短汇编代码是什么? 我遇到这个例子,但有太多的标签,如hi_temp:,.data等,最小版本是什么?

内存间接调用和寄存器间接调用的区别

内存间接调用和寄存器间接调用有什么区别? 我正试图学习一些关于linux rootkit检测的知识,我怎样才能在反汇编的内存中识别这种调用? 在编译之前他们如何看待C语言?

NASM 32位:通过printf打印注册内容

我是新来的组装。 我有不同的输出,从我所期望的简单的代码。 每次在printf被调用之前, eax内容都会被右移一些数字。 我究竟做错了什么? 谢谢。 码: ;file name : testing.asm ;assemble and link with: ;nasm -f elf testing.asm && gcc -m32 -o testing testing.o extern printf ; the C function, to be called SECTION .data ; Data section, initialized variables a: dd 15 ; int a=15 str: db "content in eax=%d", 10, 0 SECTION […]

从中断返回时必须使用IRET吗?

IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等等,但是我们也可以自己恢复寄存器。 例如,“movl”可以用来恢复%esp寄存器,“jmp”可以跳转指向存储在堆栈上的EIP的地址。 Linux内核通过IRET(所有中断)返回,这是一个权重指令。 一些内核操作(如上下文切换)经常发生。 IRET不是浪费吗?

没有gcc的gdb

是否有可能运行GDB与程序汇编与与ld链接? 使用gcc添加标志-g允许debugging,但我得到错误No symbol table is loaded. Use the "file" command 尝试将断点添加到加载的程序时, No symbol table is loaded. Use the "file" command 。 谢谢! 编辑也许我应该说清楚,我正在学习和编程汇编。 我真正想要的是一个堆栈跟踪,但能够使用GDB会很好。 分辨率 as -g运行as -g诀窍。 谢谢你所有的答复!

Bash – 如何计算指令数量?

我有一些* .s汇编文件。 我想要统计它们包含的指令数量。 例如,要计算所有的MUL指令,我需要: cat *.s | grep -P '\t'"mul" | wc -l 这给了我所有的指令复合数。 我想有这样的输出: mul: 893 add: 12054 sub: 2356 … 问题是没有目标平台支持的指令表。 每个目标平台都有不同的指令集。 支持的指令必须从现有的程序集文件中推导出来。 我可以在没有Perl / Python代工的情况下在Bash中完成吗?

如何在汇编程序中打开文件并进行修改?

我开始学习汇编,而我正在使用Unix。 我想打开一个文件,并在上面写上“Hello world”。 section.data textoutput db 'Hello world!', 10 lentext equ $ – textoutput filetoopen db 'hi.txt' section .text global _start _start: mov eax, 5 ;open mov ebx, filetoopen mov ecx, 2 ;read and write mode int 80h mov eax, 4 mov ebx, filetoopen ;I'm not sure what do i have to put here, what […]