Tag: 组装

如何组装GAS组件并将其与Open Watcom C库链接?

我试图生成16位DOS可执行文件,但使用gcc编译器。 所以我使用古老的gcc-4.3 ia16端口。 我创建了我的构建的Docker镜像: https : //registry.hub.docker.com/u/ysangkok/ia16-gcc-rask 这是我正在尝试的: host $ mkdir results host $ docker run -v $PWD/results:/results -it ysangkok/ia16-gcc-rask container $ cd results 我没有包含头文件,导致gcc无法使用OpenWatcom的libc头文件。 container $ echo ‘main() { printf(“lol”); }’ > test.c 我没有链接因为我没有16位binutils可用。 如果我构建一个目标文件,它没有正确标记为16位。 container $ /trunk/build-ia16-master/prefix/bin/ia16-unknown-elf-gcc -S test.c 现在我有这个汇编文件: .arch i8086,jumps .code16 .att_syntax prefix #NO_APP .section .rodata .LC0: .string “lol” .text .p2align […]

如何在一个WinAPI挂钩中创建一个Hook和Trampolinefunction

所以我一直在学习钩子和使用trampolines的概念,以绕过/执行WinAPI钩子函数中的数据(在不同的可执行文件中,使用DLL注入)。 到目前为止,我知道如何使用程序集和C的混合物来制作它(蹦床和钩子),但我似乎不能只使用C来做,因为我似乎缺少一些东西。 如果有人能告诉我我做错了什么以及如何修复它,我会很感激。 现在我的代码: #include unsigned char* address = 0; __declspec(naked) int __stdcall MessageBoxAHookTrampoline(HWND Window, char* Message, char* Title, int Type) { __asm { push ebp mov ebp, esp mov eax, address add eax, 5 jmp eax } } int __stdcall MessageBoxAHook(HWND Window, char* Message, char* Title, int Type) { wchar_t* WMessage = L”Hooked!”; wchar_t* […]

在C中使用ASM命令

关于在c中使用ASM,我有一个小问题。 我想执行指令: LDR PC,=0x123456 这给了我错误“操作数中的意外令牌”。 asm(“LDR PC,=0x123456”); 这给出了“无效约束”。 asm(“LDR PC,” : “m” (0x123456)); 这样做的正确方法是什么?

计算位数的最快方法

可能重复: 如何计算32位整数中的设置位数? 给出一个unsigned char类型的值,计算它中的总位数。最快的方法是什么? 我写了三个函数,如下所示,最好的方法是什么,有人可以提出更快的一个吗?(我只想要非常快的一个) const int tbl[] = { #define B2(n) n, n+1, n+1, n+2 #define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2) #define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2) B6(0), B6(1), B6(1), B6(2) }; char naivecount (unsigned char val) { char cnt = 0; while (val) { cnt += (val & 1); val = val >> […]

ARM GCC生成函数序言

我提到ARM工具链可以生成不同的函数序言。 实际上,我看到了两个完全不同的function序言的obj文件(vmlinux): 第一种情况看起来像: push {some registers maybe, fp, lr} (lr ommited in leaf function) 第二种情况看起来像: push {some registers maybe, fp, sp, lr, pc} (i can confuse the order) 所以当我看到第二个推动额外的pc和sp。 另外我在崩溃实用程序(kdump项目)中看到了一些注释,内核堆栈框架应该有格式{…,fp,sp,lr,pc}让我更加困惑,因为我看到在某些情况下它不是真正。 1.)我是否正确需要一些gcc额外的标志来推动额外的pc和sp在functionprolog? 如果是的话他们是什么? 2.)这是用来做什么的? 基本上,据我所知,我可以只用FP和LR展开堆栈,为什么我需要这个额外的值? 3.)如果这个事情与编译标志没有任何关系 – 我怎么能强制生成这个扩展函数prolog,又是什么目的? 谢谢。

从C源代码调用程序集例程

我有这个简单的C源代码: #include extern int Sum(int,int); int main() { int a,b,s; a=1 , b=2; s = Sum(a,b); return 0; } 我有这个s.asm定义函数_Sum: global _Sum _Sum: push ebp ; create stack frame mov ebp, esp mov eax, [ebp+8] ; grab the first argument mov ecx, [ebp+12] ; grab the second argument add eax, ecx ; sum the arguments […]

了解基指针和堆栈指针:在gcc输出的上下文中

我有以下C程序: int main() { int c[10] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2}; return c[0]; } 当使用带-gcc的-S指令编译时,我得到以下程序集: .file “array.c” .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, -48(%rbp) movl $0, -44(%rbp) movl $0, -40(%rbp) movl $0, […]

编程语言和方法效率低下吗? (需要汇编和C知识)

很长一段时间,我正在思考和研究汇编forms的C语言编译器的输出,以及CPU架构。 我知道这对你来说可能很愚蠢,但在我看来,某些事情是非常无效的。 如果我错了,请不要生气,并且有一些原因我没有看到所有这些原则。 如果你告诉我为什么这样设计,我会很高兴的。 我实际上真的相信我错了,我知道让人们聚在一起的人的天才头脑知道这样做的理由。 究竟是什么,你问? 我马上告诉你,我用C作为例子: 1:堆栈本地范围内存分配: 因此,典型的本地内存分配使用堆栈。 只需将esp复制到ebp,然后通过ebp分配所有内存。 好吧,如果您明确需要默认堆栈RAM,我会理解这一点,但是如果我理解它正确,现代操作系统会使用分页作为应用程序和物理RAM之间的转换层,当您需要的地址在到达实际RAM之前进一步转换字节。 那么为什么不说0x00000000是int a,0x00000004是int b等等? 并通过mov 0x00000000,#10访问它们? 因为您实际上不会访问内存块0x00000000和0x00000004,而是您的操作系统将分页表设置为。 实际上,由于ebp和esp的内存分配使用间接寻址,“my”方式会更快。 2:变量分配的两面性: 运行应用程序时,Loader将其代码加载到RAM中。 当您创建变量或字符串时,编译器会生成在main中创建时将这些值推送到顶部堆栈的代码。 所以有实际的指令,以及内存中的实际数字。 因此,RAM中有2个相同值的条目。 一种是指令forms,第二种是RAM中实际字节的forms。 但为什么? 为什么不只是在声明变量计数到哪个内存块时比使用时,只需插入这个内存位置?

如何在Xcode LLVM中编写关于LOOP的内联汇编代码?

我正在研究内联assembly。 我想在Xcode 4 LLVM 3.0编译器下在iPhone中编写一个简单的例程。 我成功编写了基本的内联汇编代码。 例子: int sub(int a, int b) { int c; asm (“sub %0, %1, %2” : “=r” (c) : “r” (a), “r” (b)); return c; } 我在stackoverflow.com找到它并且它工作得很好。 但是,我不知道如何编写有关LOOP的代码。 我需要汇编代码 void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity) { for(int i=0; i<numPixels; i++) { dst[i] = src[i] + […]

快速ARM NEON memcpy

我想在ARMv7核心上复制图像。 天真的实现是每行调用memcpy。 for(i = 0; i < h; i++) { memcpy(d, s, w); s += sp; d += dp; } 我知道以下内容 d, dp, s, sp, w 都是32字节对齐,所以我的下一个(仍然非常天真)实现是沿着的 for (int i = 0; i < h; i++) { uint8_t* dst = d; const uint8_t* src = s; int remaining = w; asm volatile ( "1: \n" […]