Articles of 组装

在linux中,如何通过GNU ARM组件来完成系统调用

到目前为止,我只知道如何通过gnu arm assembly退出一个程序。 #exit(0) mov r0, #0 # return code mov r7, #1 # supervisor service number svc # call supervisor service 但是还有很多其他的系统调用,例如read,write,fork ……我想他们每个人都需要不同的服务号码,不同数量的寄存器作为参数,以及如何使用寄存器的不同规则。 我的问题是我可以从哪里获得关于为每个人编写程序集的信息。 我search谷歌,但信息是在这个话题较less。

预加载自定义strchr() – ubuntu崩溃

我实现了strchr() global strchr strchr: cmp byte[rdi], 0 je end cmp [rdi], sil je end add rdi, 1 jmp strchr end: mov rax, rdi ret 当我把它预加载为.so使用, export LD_PRELOAD=abs/path/to/lib.so Ubuntu 16.04崩溃。 有时它完全是crahses,有时它显示SIGILL(损坏的数据?)。 当我预载使用opensuse 4,它的工作原理。 任何想法为什么?

从汇编程序获取命令行参数

通读“专业汇编语言书”; 它似乎为读取命令行参数提供了一个错误的代码。 我纠正了一下,现在它已经从segfaulting转到阅读参数计数然后segfaulting。 以下是完整的代码: .data output1: .asciz "There are %d params:\n" output2: .asciz "%s\n" .text .globl main main: movl 4(%esp), %ecx /* Get argument count. */ pushl %ecx pushl $output1 call printf addl $4, %esp /* remove output1 */ /* ECX was corrupted by the printf call, pop it off the stack so that we […]

汇编简单的I / O代码。 诠释为string错误

我已经提出了一个问题,人们指着我一个整数的string转换。 反之亦然。 我现在只是复制它,所以我可以看看我的程序是否工作,稍后我会尝试写我自己的。 但是有一个问题,我找不到我犯的错误。 在最后一次input之后,程序总是以分段错误退出。 我试图删除int到string转换,只显示input的值,它的工作。 所以我一定是做了错误的转换。 这是我的第一个程序之一,我真的需要明白为什么它不会工作如果我想进一步发展。 谢谢。 这是我的代码: section .text global _start _start: mov edx, lenask mov ecx, ask mov ebx, 1 mov eax, 4 int 0x80 mov edx, 5 mov ecx, input mov ebx, 0 mov eax, 3 int 0x80 mov edx, lenask2 mov ecx, ask2 mov ebx, 1 mov eax, 4 […]

GNU as:改变输出文件格式

as ELF的默认值。 我有一些PIC代码,我想汇编到这一点 – 只有原始指令,没有章节等我相信使用nasm你可以通过没有select的组装来实现这一点,并开始你的代码与BITS 32指令(一32位架构)。 如何用as ? 系统: – Ubuntu 12.04。 – 作为2.2。 – x86 32b

从Linux汇编语言中使用pthread_mutex_timedlock

那个设定: 我想在我的32位汇编语言程序中使用pthreads中的pthread_mutex_timedlock函数。 代码如下所示: struct timespec .tv_sec dd ? ; time in seconds .tv_nsec dd ? ; time is nano seconds ends ;…. .time timespec ; the timespec structure ;…. ; the code where pthread_mutex_timedlock is used mov eax, [.timeout] ; the timeout in [ms] mov ecx, 1000 cdq div ecx ; the timeout in eax […]

有没有人得到在Linux Wine的MASM汇编语言工作?

显然WIne不支持16位DOS应用程序。 任何人都知道如何获得MASM英特尔风格的assembly工作?

在GDB中拆解C函数 澄清GAS大会指示

我有写在这里的C函数(它有一个缓冲区溢出漏洞) void func(char *str) { char buffer[12]; int a=9; strcpy(buffer,str); } 它在gdb中的汇编转换为 |0x4005b4 <func> push %rbp |0x4005b5 <func+1> mov %rsp,%rbp |0x4005b8 <func+4> sub $0x40,%rsp |0x4005bc <func+8> mov %rdi,-0x38(%rbp) |0x4005c0 <func+12> mov %fs:0x28,%rax |0x4005c9 <func+21> mov %rax,-0x8(%rbp) |0x4005cd <func+25> xor %eax,%eax |0x4005cf <func+27> movl $0x9,-0x24(%rbp) |0x4005d6 <func+34> mov -0x38(%rbp),%rdx |0x4005da <func+38> lea -0x20(%rbp),%rax |0x4005de <func+42> mov […]

为什么在反汇编代码中有一些“无意义的”内存插槽?

我使用objdump来反汇编32位Linux上的一些ELF文件。 asm文件是英特尔格式。 在反汇编文件中,我注意到像下面的一些内存插槽: 80483ed: c7 44 24 18 07 00 00 mov DWORD PTR [esp+0x18],0x7 80483f4: 00 80483f5: c7 44 24 1c 0c 00 00 mov DWORD PTR [esp+0x1c],0xc 80483fc: 00 80483fd: c7 44 24 20 01 00 00 mov DWORD PTR [esp+0x20],0x1 8048404: 00 8048405: c7 44 24 24 fe ff ff mov DWORD […]

是否可以使用`as`来组装和运行原始CPU指令?

这里有几个相关的问题。 考&#x8651;一个只包含以下两条指令的程序 movq 1, %rax cpuid 如果我把它放到一个名为Foo.asm的文件中,并且as Foo.asm运行as Foo.asm在便携式GNU汇编程序中,我将在我的系统上得到一个名为a.out的文件,大小为665字节。 如果我然后chmod 700 a.out并尝试./a.out ,我会得到一个错误,说cannot execute binary file 。 为什么这个文件这么大,如果我只是试图把两个asm指令翻译成二进制文件呢? 为什么二进制文件不能被执行? 我提供了有效的指令,所以我希望CPU能够执行它们。 我怎样才能得到我的input文件中的asm指令的二进制操作码,而不是一堆额外的东西? 一旦我有了答案3,我怎样才能让我的处理器执行它们? (假设我没有运行特权指令。)