首页 文章
  • 4 votes
     answers
     views

    当通过qemu运行时,简单的引导加载程序在RAM之外

    我正在尝试使用qemu运行一个简单的引导程序 . start: jmp start times 510 - ($ - $$) db 0 db 55h db 0AAh 我做了什么,我得到了什么: $ nasm -f bin -o boot.bin boot.s $ dd if=/dev/zero of=boot.img bs=1M count=64 64+0 ...
  • 1 votes
     answers
     views

    汇编:缓冲区溢出攻击,插入代码

    我有一个缓冲区溢出实验室用于cs中的家庭作业(也称为攻击实验室) . 在这个阶段,我必须溢出一个char数组,插入我自己的代码以改变一个寄存器,并重定向到一个“隐藏的函数” . 这是每次执行的主要代码: 000000000040187a <getbuf>: 40187a: 48 83 ec 38 sub $0x38,%rsp 40187e: 48 ...
  • 0 votes
     answers
     views

    我为什么要添加rax和rdx?

    这是一个传递String作为输入的程序 . 我对下面显示的汇编代码感到困惑,特别是第6行 . 这是我从我的研究中理解的: rbp-48 是一个指向存储 argv 的堆栈地址的指针 . ( argv 本身,是指向 argv 数组开头的地址) 现在rax寄存器存储 argv 数组地址 . 然后我们向rax添加8个字节 . 这意味着rax现在指向 argv[1] 的地址 . (据我所知,...
  • 13 votes
     answers
     views

    用gcc清理x86_64组件输出? [重复]

    这个问题在这里已有答案: How to remove “noise” from GCC/clang assembly output? 3个答案 我现在通过在C语言中编写语句,用“gcc -S”编译它们并研究输出,一直在教自己GNU Assembly . 这在x86(和使用-m32编译)上工作正常,但在我的AMD64盒子上,对于这段代码(仅作为示例): int main() { retu...
  • 2 votes
     answers
     views

    NASM x86_64在编写命令行参数时遇到问题,在rax中返回-14

    我正在使用elf64编译并尝试获取参数并将其写入控制台 . 我将函数称为./test wooop 在单步执行gdb之后似乎没有问题,一切都设置好了: rax:0x4 rbx:0x1 rcx:指向字符串,x / 6cb $ rcx给出'w''o''o''o''p'0x0 rdx:0x5 <---正确确定长度 在int 80h之后,rax包含-14并且没有任何内容打印到控制台 . 如果我在.da...
  • 1 votes
     answers
     views

    在反汇编代码中跟踪调用堆栈

    我正在尝试调试棘手的核心转储(来自-O2优化二进制) . // Caller Function void caller(Container* c) { std::list < Message*> msgs; if(!decoder.called(c->buf_, msgs)) { .... ..... } // Called Function boo...
  • 2 votes
     answers
     views

    Linux x86_64汇编套接字编程

    Hello all. 所以我正在学习装配 .按照我通常的学习步骤,我接受任何新语言,我已经到了组装网络 . 其中,遗憾的是我没有那么顺利,因为我在第0步几乎失败了,这将获得一个可以开始通信的套接字 . 汇编代码应大致等于以下C代码: #include <stdio.h> #include <sys/socket.h> int main(){ int soc...
  • 1 votes
     answers
     views

    如何在进入dll时访问堆栈上传递的参数?

    我从ctypes调用NASM 64位DLL . dll需要五个输入参数 . 在Windows调用约定中,前四个在rcx,rdx,r8和r9中传递,第五个在堆栈上传递 . x64调用约定概述doc(https://docs.microsoft.com/en-us/cpp/build/overview-of-x64-calling-conventions)说"Any parameters ...
  • 565 votes
     answers
     views

    LEA指令的目的是什么?

    对我来说,它看起来像一个时髦的MOV . 它的目的是什么,我什么时候应该使用它?
  • 1 votes
     answers
     views

    指令获取访问传递锁定的指令

    英特尔软件开发人员手册提到“指令获取和页表访问可以传递锁定的指令” . 这是什么意思,为什么重要? 有一篇帖子说许多Windows函数都以 MOV EDI, EDI 指令开头,因为它对安全代码挂钩非常有用:它可以用两个字节的相对跳转进行原子替换 . 但是如果对内存的获取访问可以"pass locked instructions",是否可能发生以下情况? cpu 0原子地用相...
  • 1 votes
     answers
     views

    32位,64位和80位浮点IEEE-754的可表示值范围?

    在C标准中它说浮动文字: 如果缩放值不在其类型的可表示值范围内,则程序格式错误 . 缩放值是重要部分乘以10 ^指数部分 . 在x86-64下: float 是单精度IEEE-754 double 是双精度IEEE-754 long double 是80位扩展精度IEEE-754 在这种情况下,这三种类型中每种类型的可重复值的范围是多少?这记录在哪里?或者如何计算?
  • 2 votes
     answers
     views

    从源头 Build bazel - 失败

    我的实验目标是在基于Jetson TK1臂的嵌入式板上构建张量流 . 由于官方版本没有提供预先构建的arm架构张量流,因此我不得不选择从源代码构建它 . 要构建张量流,我们需要Bazel,它也应该从源代码构建 . 现在我被困在这里,根本无法建造bazel . 我已经提到了各种博客和github项目,并试图按照每个人说它为他们工作的说明 . 1)Tensorflow on Raspberry-pi ...
  • 292 votes
     answers
     views

    如何确定.NET程序集是否为x86或x64构建?

    我有一个任意的.NET程序集列表 . 我需要以编程方式检查每个DLL是否是为x86构建的(而不是x64或任何CPU) . 这可能吗?
  • 75 votes
     answers
     views

    什么是“代表; nop;“在x86汇编中意味着什么?它与“暂停”指令相同吗?

    rep; nop 是什么意思? 与 pause 指令相同吗? 是否与 rep nop 相同(没有分号)? 简单的 nop 指令有什么区别? 在AMD和英特尔处理器上它的表现是否不同? (奖金)这些说明的官方文件在哪里? 这个问题的动机 在another question的评论中进行了一些讨论后,我意识到我不知道 rep; nop; 在x86(或x86-64)程序集中的...
  • -1 votes
     answers
     views

    如何在Ubuntu 11.10上安装gcc 4.4.6

    我已经读过GCC 4.4.6打包在Ubuntu 11.10版(Oneiric)中 . 我的问题是如何使用apt-get安装它,因为 apt-get install gcc446 既不起作用 apt-get install gcc44.
  • 2 votes
     answers
     views

    汇编编码strdup . Malloc在共享库中调用

    我有一个问题,我在调用malloc时无法编译我的strdup . 当我不打电话给malloc时,它会完美地编译我的共享库,所以如果有人可以帮助我那就太棒了! 这是我的代码: BITS 64 DEFAULT REL global my_strdup:function extern malloc my_strdup: [...] call malloc ...
  • 2 votes
     answers
     views

    架构x86_64的未定义符号:“_ nlist”

    在我维护的一些iOS代码中添加64位支持时,我发现nlist函数不适用于x86_64架构(64位iOS模拟器) . 代码调用nlist()适用于所有其他arch(armv7,armv7s,arm64和i386)但不能成功构建x86_64,其中链接器无法在链接库中找到符号 . 它可以在使用Xcode创建的模板项目上重现,只需添加: #import <mach-o/nlist.h> in...
  • 89 votes
     answers
     views

    为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

    在x86-64 Tour of Intel Manuals中,我读到了 也许最令人惊讶的事实是,诸如MOV EAX,EBX之类的指令会自动将RAX寄存器的高32位归零 . 同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们: 64位操作数在目标通用寄存器中生成64位结果 . 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果 . 8位和16...
  • 1 votes
     answers
     views

    Ipi - 进程间中断延迟

    Cpus:英特尔,amd . Arch:x86_64 . 我很难测量/查找有关Interprocessor Interrupts延迟的资源 . 它将取决于处理器,apic版本,但我在这里谈论的数量级 . 我应该期待微秒,十分之一微秒,更低/更高的东西吗? 如果有人能给我一个提示,我真的很感激 . 谢谢
  • 3 votes
     answers
     views

    如何在NASM中推送64位int?

    我正在尝试推送一个64位整数但是在组装NASM时似乎想把它看成是一个DWORD而不是QWORD . 我正在使用ASM来创建shellcode,我需要将64位DLL注入到64位进程中 . 第一个QWORD是旧指令指针,第二个是包含DLL地址的地址,第三个是LoadLibrary的地址 . 占位符在运行时填充 . section .text global _start _start: BITS...
  • 47 votes
     answers
     views

    x86中“PAUSE”指令的目的是什么?

    我正在尝试创建一个自旋锁的哑版 . 浏览网页时,我在x86中遇到了一个名为“PAUSE”的汇编指令,该指令用于向处理器提供当前在此CPU上运行自旋锁的提示 . 英特尔手册和其他可用信息说明了这一点 在大多数情况下,处理器使用此提示来避免内存顺序违规,从而大大提高了处理器性能 . 因此,建议在所有自旋等待循环中放置PAUSE指令 . 文档还提到“等待(一些延迟)”是指令的伪实现 . 上段的最后一...
  • 13 votes
     answers
     views

    在x86-64 CPU上重现具有交叉修改代码的意外行为

    问题 对于可能在x86或x86-x64系统上触发意外行为的交叉修改代码有哪些想法,其中一切都在交叉修改代码中正确完成,除了在执行处理器之前在执行处理器上执行序列化指令之外修改过代码? 如下所述,我有一个Core 2 Duo E6600处理器进行测试,明确提到它是一个容易出现问题的处理器 . 我会在这台机器上测试与我分享的任何想法并提供更新 . 背景 在x86和x64系统上,编写交叉修改代码的官方指...
  • 11 votes
     answers
     views

    加速x64汇编器ADD循环

    我正在研究很长整数的乘法运算(大约100,000个十进制数字) . 作为我的图书馆的一部分,我要添加两个长数字 . 分析表明我的代码在add()和sub()例程中运行的时间高达25%,因此尽可能快地运行它们非常重要 . 但我还没有看到太大的潜力 . 也许你可以给我一些帮助,建议,见解或想法 . 我会测试它们然后再回复你 . 到目前为止,我的添加例程进行了一些设置,然后使用了8次展开的循环: mov...
  • 8 votes
     answers
     views

    GCC x86-64装配输出欠佳,为什么?

    查看以下代码的程序集输出时(无优化,-O2和-O3产生非常相似的结果): int main(int argc, char **argv) { volatile float f1 = 1.0f; volatile float f2 = 2.0f; if(f1 > f2) { puts("+"); } else...
  • 6 votes
     answers
     views

    GNU内联汇编优化

    我正在尝试为高度优化的x86-64位操作代码编写一个小型库,并且正在摆弄内联asm . 在测试这个特殊情况时引起了我的注意: unsigned long test = 0; unsigned long bsr; // bit test and set 39th bit __asm__ ("btsq\t%1, %0 " : "+rm" (test) : &q...
  • 9 votes
     answers
     views

    为什么GCC和Clang不使用cvtss2sd [内存]?

    我'm trying to optimize some code that'应该从内存中读取单精度浮点数并以双精度对它们进行算术运算 . 这正成为一个重要的性能瓶颈,因为将数据作为单一精度存储在内存中的代码基本上比将内存中的数据存储为双精度的等效代码 slower . 下面是一个玩具C程序,它捕捉了我的问题的本质: #include <cstdio> // noinline to ...
  • 21 votes
     answers
     views

    优化x64汇编程序MUL循环

    我正在编写需要快速乘以大数字的数学代码 . 它分解为整数数组与单个整数的乘法 . 在C中,这看起来像这样(在unsigned上): void muladd(unsigned* r, const unsigned* a, unsigned len, unsigned b) { unsigned __int64 of = 0; // overflow unsigned i = 0; /...
  • 16 votes
     answers
     views

    长多字节NOP:通常理解的宏或其他符号

    x86(和x86_64)处理器不仅具有单字节 NOP 指令,而且还具有各种类型的多字节NOP类指令,这不是什么大秘密 . 有我找到的那些: AMD推荐,参考 . AMD Software Optimization Guide for AMD Family 15h Processors, document #47414,第5.8节"Code Padding with Operand-Si...
  • -1 votes
     answers
     views

    加载内存块的x86指令

    我有一些x86汇编代码 . 我想确定加载内存 so that I can establish how many distinct cache-line blocks are being accessed by the CPU 的说明 . 我应该注意的x86指令的子集是什么?最初我只是认为这是所有以 mov 开头的指令,它还加载 qword 或 dword ,并包含 ptr 参考,但我想先检查一下 ...
  • 2 votes
     answers
     views

    软件预取生成缓存未命中

    我试图通过大型阵列上的软件预取来进行一些性能改进,大约5000万个条目,显然不适合L3缓存 . 访问数组是随机的,但我对下一步要访问的位置有一定的可预测性 . 有趣的是,预取指令在实际访问之前导致高速缓存未命中 . const struct _bucket *prim_bkt; prim_bkt = &(h->buckets[prim_bucket_idx]); __builtin...

热门问题