我使用AT&T语法编写了一个程序,用于GNU汇编程序:.dataformat:.ascii"%d\n".text.globalmainmain:mov$format,%rbxmov(%rbx),%rdimov$1,%rsicallprintfret我使用GCC来汇编和链接:gcc-omainmain.s我用这个命令运行它:./main当我运行该程序时出现段错误。通过使用gdb,它说printfnotfound。我试过“.externprintf”,它不起作用。有人建议我应该在调用printf之前存储堆栈指针并在RET之前恢复,我该怎么做? 最佳答案
我使用AT&T语法编写了一个程序,用于GNU汇编程序:.dataformat:.ascii"%d\n".text.globalmainmain:mov$format,%rbxmov(%rbx),%rdimov$1,%rsicallprintfret我使用GCC来汇编和链接:gcc-omainmain.s我用这个命令运行它:./main当我运行该程序时出现段错误。通过使用gdb,它说printfnotfound。我试过“.externprintf”,它不起作用。有人建议我应该在调用printf之前存储堆栈指针并在RET之前恢复,我该怎么做? 最佳答案
我很好奇在AARCH64-Linux机器上运行旧的ARM32-Linux程序的可行性,我做了一些实验:编写程序“Hello,World!”并使用arm-none-linux-gnueabi-gcc和aarch64-linux-gnu-gcc对其进行静态编译。使用busybox和aarch64编译器静态构建和创建ramdisk。将2“Hello,World!”程序(在ARM32和AARCH64中)到ramdisk。使用vexpress_defconfig和aarch64编译器构建一个简单的AARCH64-Linux内核。使用qemu-system-aarch64运行内核和ramdisk。
我很好奇在AARCH64-Linux机器上运行旧的ARM32-Linux程序的可行性,我做了一些实验:编写程序“Hello,World!”并使用arm-none-linux-gnueabi-gcc和aarch64-linux-gnu-gcc对其进行静态编译。使用busybox和aarch64编译器静态构建和创建ramdisk。将2“Hello,World!”程序(在ARM32和AARCH64中)到ramdisk。使用vexpress_defconfig和aarch64编译器构建一个简单的AARCH64-Linux内核。使用qemu-system-aarch64运行内核和ramdisk。
我想检查在glibc中执行系统调用的代码。我发现了这样的东西:ENTRY(syscall)movq%rdi,%rax/*Syscallnumber->rax.*/movq%rsi,%rdi/*shiftarg1-arg5.*/movq%rdx,%rsimovq%rcx,%rdxmovq%r8,%r10movq%r9,%r8movq8(%rsp),%r9/*arg6isonthestack.*/syscall/*Dothesystemcall.*/cmpq$-4095,%rax/*Check%raxforerror.*/jaeSYSCALL_ERROR_LABEL/*Jumptoerro
我想检查在glibc中执行系统调用的代码。我发现了这样的东西:ENTRY(syscall)movq%rdi,%rax/*Syscallnumber->rax.*/movq%rsi,%rdi/*shiftarg1-arg5.*/movq%rdx,%rsimovq%rcx,%rdxmovq%r8,%r10movq%r9,%r8movq8(%rsp),%r9/*arg6isonthestack.*/syscall/*Dothesystemcall.*/cmpq$-4095,%rax/*Check%raxforerror.*/jaeSYSCALL_ERROR_LABEL/*Jumptoerro
我一直在关注这本优秀的编程基础书籍,想学习汇编。虽然此时不在本书中,但我想在32位机器上从C调用我的汇编函数,这在根据本书工作时一样有效。我在这里所做的是将第一个参数存储在%ebx中,将第二个参数存储在%ecx中。.typepower,@function.globlpowerpower:pushq%ebpmovl%esp,%ebpsubl$4,%espmovl8(%ebp),%ebxmovl12(%ebp),%ecx我将这个(以及函数的其余部分)编译成一个目标文件,创建一个main.c,我在其中原型(prototype)化函数并调用它,如下所示:intpower(intb,intx);
我一直在关注这本优秀的编程基础书籍,想学习汇编。虽然此时不在本书中,但我想在32位机器上从C调用我的汇编函数,这在根据本书工作时一样有效。我在这里所做的是将第一个参数存储在%ebx中,将第二个参数存储在%ecx中。.typepower,@function.globlpowerpower:pushq%ebpmovl%esp,%ebpsubl$4,%espmovl8(%ebp),%ebxmovl12(%ebp),%ecx我将这个(以及函数的其余部分)编译成一个目标文件,创建一个main.c,我在其中原型(prototype)化函数并调用它,如下所示:intpower(intb,intx);
/proc/$pid/maps显示在x86_64Linux上没有rwx权限的页面。我注意到,当我在64位Linux上读取/proc/$pid/maps时,我有没有权限的内存页,但在32位Linux中,它们不存在。我正在尝试监控我的进程的内存使用情况,但我很困惑。为什么有些页面没有rwx权限。他们正在消耗我的内存!这是“top”的64位Linux输出的片段%cat/proc/21367/maps3154200000-315420d000r-xp00000000fd:004835776/lib64/libproc-3.2.7.so315420d000-315440d000**---p**0
/proc/$pid/maps显示在x86_64Linux上没有rwx权限的页面。我注意到,当我在64位Linux上读取/proc/$pid/maps时,我有没有权限的内存页,但在32位Linux中,它们不存在。我正在尝试监控我的进程的内存使用情况,但我很困惑。为什么有些页面没有rwx权限。他们正在消耗我的内存!这是“top”的64位Linux输出的片段%cat/proc/21367/maps3154200000-315420d000r-xp00000000fd:004835776/lib64/libproc-3.2.7.so315420d000-315440d000**---p**0