草庐IT

ASSEMBLY

全部标签

linux - 自修改代码总是在 Linux 上出现段错误

我找到了一篇关于自修改代码的文章并尝试做一些例子,但我总是遇到段错误。据我所知,存在内存权限违规。代码段是(r)ead/e(x)ecute,因此写入结果的尝试导致此错误。有没有办法通过在运行时或之前更改内存权限来测试程序?我使用的是linux,示例是用GAS汇编语言编写的。.externmemcpy.section.datastring:.asciz"whatever"string_end:.section.bss.lcommbuf,string_end-string.section.text.globlmainmain:callchangermov$string,%edxlabel:

linux - Linux 中摩托罗拉 68000 的编程环境

大家好我这学期要学习微型计算机的结构和应用类(class),我们将使用摩托罗拉68000系列CPU/板进行编程。类(class)大纲建议在家中运行Easy68K或TeessideMotorola68000汇编器/仿真器之类的东西来测试我们的程序。我告诉我的教授我运行x64Linux,并询问我需要什么样的环境才能完成我的类(class)作业。他说最容易使用的环境是安装了两个建议应用程序之一的WindowsXP32位VM,但是,他并不关心我使用什么,只要我可以在家测试我写的东西。所以我想问一下是否存在某种适用于Linux的模拟器或环境,以便我可以测试我的代码,以及在Linux中编写和测试我

linux - Linux 中摩托罗拉 68000 的编程环境

大家好我这学期要学习微型计算机的结构和应用类(class),我们将使用摩托罗拉68000系列CPU/板进行编程。类(class)大纲建议在家中运行Easy68K或TeessideMotorola68000汇编器/仿真器之类的东西来测试我们的程序。我告诉我的教授我运行x64Linux,并询问我需要什么样的环境才能完成我的类(class)作业。他说最容易使用的环境是安装了两个建议应用程序之一的WindowsXP32位VM,但是,他并不关心我使用什么,只要我可以在家测试我写的东西。所以我想问一下是否存在某种适用于Linux的模拟器或环境,以便我可以测试我的代码,以及在Linux中编写和测试我

C 到汇编调用约定 32 位与 64 位

我一直在关注这本优秀的编程基础书籍,想学习汇编。虽然此时不在本书中,但我想在32位机器上从C调用我的汇编函数,这在根据本书工作时一样有效。我在这里所做的是将第一个参数存储在%ebx中,将第二个参数存储在%ecx中。.typepower,@function.globlpowerpower:pushq%ebpmovl%esp,%ebpsubl$4,%espmovl8(%ebp),%ebxmovl12(%ebp),%ecx我将这个(以及函数的其余部分)编译成一个目标文件,创建一个main.c,我在其中原型(prototype)化函数并调用它,如下所示:intpower(intb,intx);

C 到汇编调用约定 32 位与 64 位

我一直在关注这本优秀的编程基础书籍,想学习汇编。虽然此时不在本书中,但我想在32位机器上从C调用我的汇编函数,这在根据本书工作时一样有效。我在这里所做的是将第一个参数存储在%ebx中,将第二个参数存储在%ecx中。.typepower,@function.globlpowerpower:pushq%ebpmovl%esp,%ebpsubl$4,%espmovl8(%ebp),%ebxmovl12(%ebp),%ecx我将这个(以及函数的其余部分)编译成一个目标文件,创建一个main.c,我在其中原型(prototype)化函数并调用它,如下所示:intpower(intb,intx);

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

对于以下代码:longbuf[64];registerlongrraxasm("rax");registerlongrrbxasm("rbx");registerlongrrsiasm("rsi");rrax=0x34;rrbx=0x39;__asm____volatile__("movq$buf,%rsi");__asm____volatile__("movq%rax,0(%rsi);");__asm____volatile__("movq%rbx,8(%rsi);");printf("buf[0]=%lx,buf[1]=%lx!\n",buf[0],buf[1]);我得到以下输出:

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

对于以下代码:longbuf[64];registerlongrraxasm("rax");registerlongrrbxasm("rbx");registerlongrrsiasm("rsi");rrax=0x34;rrbx=0x39;__asm____volatile__("movq$buf,%rsi");__asm____volatile__("movq%rax,0(%rsi);");__asm____volatile__("movq%rbx,8(%rsi);");printf("buf[0]=%lx,buf[1]=%lx!\n",buf[0],buf[1]);我得到以下输出:

c - 获取 x86 当前指令的地址

这个问题在这里已经有了答案:Readingprogramcounterdirectly(7个答案)关闭4年前。我正在使用x86(准确地说是64位)的Linux。有没有办法可以获取当前指令的地址。其实我想写我自己的setjmp/longjmp的简化版本。Here,R..发布了longjmp的简化版本。知道setjmp是如何实现的。一个简化版本,即不考虑异常和信号等...

c - 获取 x86 当前指令的地址

这个问题在这里已经有了答案:Readingprogramcounterdirectly(7个答案)关闭4年前。我正在使用x86(准确地说是64位)的Linux。有没有办法可以获取当前指令的地址。其实我想写我自己的setjmp/longjmp的简化版本。Here,R..发布了longjmp的简化版本。知道setjmp是如何实现的。一个简化版本,即不考虑异常和信号等...

linux - 如何使用十六进制编辑器在Linux中制作可执行的ELF文件?

只是好奇。显然,这对于实际编程而言不是一个很好的解决方案,但是我说我想在Bless(十六进制编辑器)中创建一个可执行文件。我的体系结构是x86。我可以制作一个非常简单的程序?你好,世界?无限循环?与this问题类似,但在Linux中。 最佳答案 正如我的评论中所提到的,您实际上将为可执行文件编写自己的elf-header,以消除不需要的部分。仍然需要几个部分。Muppetlabs-TinyPrograms上的文档很好地解释了此过程。为了好玩,这里有几个例子:等效于/bin/true(45字节):000000007F454C46010