Articles of x86

来自用户空间的int指令

我的印象是x86上的“int”指令没有特权。 所以,我认为我们应该能够从用户空间应用程序执行这个指令。 但似乎并不如此。 我正试图从Windows上的用户应用程序执行int。 我知道这样做可能是不对的。 但是我想有一些乐趣。 但窗户正在杀死我的应用程序。 我认为这个问题是由于条件cpl <= iopl。 有谁知道如何解决它?

如何在Windows PE 32位可执行文件中为我的代码洞创造空间

所以我想在minesweeper.exe(典型的Windows XP扫雷游戏,链接: 扫雷 )中为我的代码洞穴腾出空间。 所以我通过CFF资源pipe理器修改了文件的PE头,增加了.text部分的大小。 我尝试增加.text段的原始大小1000h(新大小是3B58),但Windows无法find入口点,游戏无法启动。 然后我尝试增加.rsrc部分的大小,添加一个新的部分,增加图像大小,但是这些尝试都没有成功,Windows说“这不是x32可执行文件”。 所以这里是一个问题:我如何为我的代码洞穴腾出空间? 我不想search编译器留下的空白空间,我想为我的代码打印1000h字节。 一个教程,以及如何做到这一点,而不破坏游戏的详细解释将是伟大的! (是的,我其实是黑客扫雷)

在64位系统(GNU工具链)上组装32位二进制文​​件

我编写可以编译的汇编代码: as power.s -o power.o 链接power.o目标文件时出现问题: ld power.o -o power 为了在64位操作系统(Ubuntu 14.04)上运行,我在power.s文件的开头添加了power.s ,但是我仍然得到错误: 分割故障(核心转储) power.s : .code32 .section .data .section .text .global _start _start: pushl $3 pushl $2 call power addl $8, %esp pushl %eax pushl $2 pushl $5 call power addl $8, %esp popl %ebx addl %eax, %ebx movl $1, %eax int $0x80 .type […]

大会 – 如何修改堆栈大小?

我是一个汇编程序devise的新手,我使用的是使用内存栈的push和pop指令。 那么,什么是堆栈默认大小,如何修改以及它的大小是多less?

Linux AMD64中使用的fs / gs寄存器如何?

在x86-64架构上,两个寄存器有一个特殊用途:FS和GS。 在linux 2.6。*中,FS寄存器似乎被用来存储线程本地信息。 那是对的吗? 什么是存储在FS:0? 有没有描述这个内容的C结构? 什么是GS的使用?

Windows 8胖二进制文件(EXE的x86和ARM)

有没有人(在这里)知道如果Windows 8将有一个胖的exe文件,可以用Visual Studio 2012编译,将在ARM和x86机器上都支持? 我猜不是,因为你不能创build胖二进制文件,只要我知道(我只知道的解决scheme是32位,创build一个64位可执行文件),将执行32或64位代码。 看起来像微软有助于扩展exe或为Windows 8创build一个胖二进制格式,至less可以为Window的扩展调色板编译一个可执行文件。 编辑:以下链接显示如何在第一个dev预览中编译ARM exe文件。 我想补充一点,因为它没有提供任何胖二进制支持的提示,但它也是在游戏早期。 我认为现在不把它作为一种可能性排除在外。 编译为ARM

如何反汇编原始x86代码?

我想反汇编我有一个可启动的x86磁盘的MBR(前512字节)。 我已经使用MBR复制到一个文件 dd if=/dev/my-device of=mbr bs=512 count=1 任何可以反汇编文件mbr的Linux实用程序的build议?

为什么这段代码使我能够检测debugging器?

为什么下面的汇编代码是反debugging工具? l1: call l3 l2: ;some code l3: mov al, 0c3h mov edi, offset l3 or ecx, -1 rep stosb 我知道C3h是RETN而且我知道stobs将al的值作为opcode根据edi的偏移量写入操作码,并且由于rep而完成了ecx次。 我也意识到stobs和stosw会运行,如果他们在intel架构上被预取作为它们的原始格式。 如果我们在debugging模式下运行程序,预取是不相关的,并且将运行l2标签(因为它是单步的),否则如果没有debugging器,它会在l1和l3之间进行乒乓。

为什么Linux二进制文件的虚拟内存地址从0x8048000开始?

在Ubuntu x86系统上拆分ELF二进制文件我不禁注意到代码(.text)部分从虚拟地址0x8048000开始,所有较低的内存地址似乎都未被使用。 这似乎是相当浪费,所有谷歌出现是民间传说涉及STACK_TOP或防止空指针解引用。 后一种情况看起来可以通过使用单个页面来修复,而不是留下128MB空白。 所以我的问题是这样的 – 为什么布局已经被固定到这些值,还是只是一个任意的select有一个明确的答案?

DMA传输RAM到RAM

我的一个朋友告诉我,在x86架构上,DMA控制器不能在两个不同的RAM位置之间传输。 它只能在RAM和外设之间传输(如PCI总线)。 这是真的? 因为AFAIK DMA控制器应该能够在位于总线上并具有地址的任意设备之间。 特别是,如果源地址和描述地址属于同一物理设备,则看不到问题。