assembly相关内容

如何在 gdb 中调用程序集?

在 gdb 中我可以使用 call 来运行函数,但是如果我想运行一些额外的程序集怎么办? 解决方案 在 GCC 5 (1) 之前,我不知道有什么方法可以运行任意机器码,除非你实际输入机器码存入内存,然后运行. 如果你想在内存中运行已经的代码,你可以将指令指针设置为开始,在结束处设置一个断点,然后继续.然后,在断点之后,将指令指针改回原来的值. 但我实际上看不到这个用例.这并不意 ..
发布时间:2022-01-20 19:57:50 其他开发

使用 gdb 在指定可执行文件之外单步汇编代码会导致错误“找不到当前函数的边界";

我在 gdb 的目标可执行文件之外,我什至没有对应于该目标的堆栈.无论如何我都想单步执行,这样我就可以验证我的汇编代码中发生了什么,因为我不是 x86 汇编方面的专家.不幸的是,gdb 拒绝进行这种简单的汇编级调试.它允许我在适当的断点处设置和停止,但是一旦我尝试单步前进,gdb 就会报告错误“找不到当前函数的边界"并且 EIP 不会改变. 其他细节: 机器代码是由 gcc asm 语 ..
发布时间:2022-01-20 19:51:24 服务器开发

哪个更快:if (bool) 或 if(int)?

哪个值更好用?布尔真还是整数 1? 上面的题目让我在 if 条件下用 bool 和 int 做了一些实验.所以出于好奇,我写了这个程序: int f(int i){if (i) 返回 99;//如果(整数)否则返回-99;}整数 g(布尔 b){if (b) 返回 99;//如果(布尔)否则返回-99;}int main(){} g++ intbool.cpp -S为每个函数生成asm代 ..
发布时间:2022-01-19 17:08:58 C/C++开发

该问题与Assembly x86-32 RET n指令有关

我知道 Ret n 的含义,但我不知道它在维护程序的运行时堆栈中的作用?我有点困惑.ret 与堆栈有关吗? 解决方案 ret n 就像 ret + add esp, n.您可以将它用于 caller-pops 调用约定. 普通的 ret 类似于 pop eip.(pop eip 不是有效指令,但它很好地表达了 ret 的作用).是的,它使用堆栈;阅读文档.http://felixcl ..
发布时间:2022-01-19 15:33:01 其他开发

在 ASM 中,c 编译器如何处理函数的结构返回值

说到C函数的返回值,返回值存放在EAX寄存器中.假设我们谈论的是 32 位寄存器,欢迎使用整数,但是当我们返回这些类型时会发生什么:long long,long double,大于 32 位的 struct/union. 解决方案 在常见的 x86 调用约定中,适合两个寄存器的对象在 RDX:RAX 中返回.这是相同的寄存器对,它是 div 和 mul 指令以及 cdq/cqo 的隐式输入 ..
发布时间:2022-01-19 15:10:35 其他开发

什么是 x86 “ret"?指令相当于?

假设我正在 x86 汇编中编写一个例程,例如“add",它将作为参数传递的两个数字相加. 在大多数情况下,这是一个非常简单的方法: 推送ebpmov ebp, espmov eax, [ebp+8]添加 eax, [ebp+12]mov esp, ebp流行音乐ret 但是,我有什么办法可以重写这个方法来避免使用“ret"指令并且仍然让它产生完全相同的结果? 解决方案 这不需要任 ..
发布时间:2022-01-19 14:46:03 其他开发

了解切换条件下的寄存器用法

我有一个 C 和汇编代码中的开关条件代码.但在我看来,设置什么是非常随意的,edx 或 eax 或 ecx? 如何区分 edx、epx、ecx、ebp?连教科书都没有给我充分的解释. #include //枚举类型创建一组常量//编号为 0 及以上typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t;in ..
发布时间:2022-01-19 11:13:06 其他开发

C switch 语句的汇编 - 它是如何工作的?

我正在阅读一本关于汇编 switch 语句的书,当输入 n 为 case: 100、102、103、104、106 时,代码具有案例/分支.它通过从 n 中减去 100 来简化跳转表,然后如果结果在6以上,则转到L2中的默认情况,否则将转到与%eax中的值匹配的相应分支. 我的问题是: 如果是这样,如果跳转表的索引保存在%eaxjmp *.L7(,%eax)吗>? 为什么他们在第 ..
发布时间:2022-01-19 11:08:31 其他开发

初始化变量和在声明后立即为其赋值有区别吗?

假设一个纯粹的非优化编译器,初始化变量和声明后赋值之间的机器代码有什么区别吗? 初始化方法: int x = 2; 赋值方法: int x;x = 2; 我使用 GCC 输出为这两种不同方法生成的程序集,并且都生成了一条机器指令: movl $2, 12(%esp) 这条指令只是将 x 变量持有的内存设置为 2 的值.GCC 可能正在对此进行优化,因为它可以识别操作的最终结果;但 ..
发布时间:2022-01-19 00:06:32 其他开发

如何修复程序集中的“错误:行尾的垃圾,第一个无法识别的字符 0xe2"

我正在尝试在我的树莓派 3 上编写一个基本的 arm 程序集文件,该文件可以通过 gcc 编译器访问 printf 和 scanf,但是在编译我的代码时出现一个奇怪的错误. 这是我用汇编编写的第三个使用 gcc 编译器的应用程序,所以我想做增量测试,所以我设置了提示和字符串,然后尝试干净地退出;但是,这是我抛出错误的代码: .data.balign 4promptNum1: .asciz ..
发布时间:2022-01-17 14:27:08 其他开发

获取寄存器中的 MSB/LSB

这似乎是一个愚蠢的问题,但我真的无法说出我错过了什么 在 ARM 7 上: 我在寄存器 0 中有一个 8 位数字,比如说 10110111 我想通过这个“循环"并用当前位做一些事情,直到 8 位完成,但是我在这个简单的问题上遇到了很多麻烦.. 我的逻辑是: - 获取 r0 中数字的 MSB/LSB- 将其移至 r1-lsl/lsr r0 但是从这个逻辑来看,我不知道你将如 ..
发布时间:2022-01-17 14:26:43 其他开发

ARM NEON 汇编程序错误:“指令不能有条件";

根据arm 信息center vadd 可以有条件地执行,但是当我尝试时 vaddeq.f32 d0,d0,d1 Xcode 返回 65: 指令不能有条件 -- vaddeq.f32 d0,d0,d1 我注意到的一件事是,似乎只有 NEON 指令会出现此错误.VFP 指令不会产生这些错误. 是否必须设置编译器标志才能启用 NEON 条件指令? 解决方案 ARM 架构参考手册说 ..
发布时间:2022-01-17 14:23:25 其他开发

arm 霓虹灯比较操作产生负一

我正在尝试以下汇编代码: vclt.f32 q9,q0,#0vst1.i32 q9,[r2:128] 但如果条件为真,则q9中的对应元素设置为负一而不是正一. 我该怎么做才能得到一个积极的? 解决方案 这对于向量比较指令是正常的,因此您可以将比较结果用作带有 AND 或 XOR 指令或其他各种用例的掩码.p> 您通常不需要 +1.例如,如果要计算匹配的元素个数,只需使用减法指令 ..
发布时间:2022-01-17 14:22:29 其他开发

从手臂组装功能返回浮点数到objective-c

我编写了一个汇编函数,可以在 iPhone 4(32 位代码)和 iPhone 6s(64 位代码)上正常运行.我从 Objective-c 中的调用函数传入四个浮点数. 这是我用于 4 个浮点数的结构,下面是函数的原型 - 可以在我的 Objective-c 代码的顶部找到. struct myValues{//这是一个结构.它用于方便地对多个数据项进行逻辑分组.浮动A;//我在这里使用 ..
发布时间:2022-01-17 14:22:13 移动开发

为什么 CPSR 不是银行寄存器?

在 ARM 中,SPSR 是一个分组寄存器,即每次模式更改后,CPSR 都会复制到 SPSR,模式返回后,SPSR 会复制回 CPSR.为什么 CPSR 不直接存入银行?每次模式更改似乎都有两条额外的指令(复制到spsr,复制到cpsr) 解决方案 手动模式更改不是 ARM 的效率目标.通常,手动模式更改仅用于在启动或初始化时设置堆栈等. cpsr 是活动 副本.为什么我们有一个存储 ..
发布时间:2022-01-17 14:21:34 其他开发

.size X,.-X 之类的代码模式有什么作用?

我的问题是关于我在 ARM CORTEX M 启动文件中找到的一些流行但没有详细记录的代码,例如 这个STM32. “模式"是: .size X,.-X ,其中 X 是符号或标签. 我找到了这个答案并了解.size指令和 dot 特殊符号 工作,但仍然完整的行似乎对我没有任何作用..-X 操作的结果不会存储在任何地方. 谁能解释一下这条线的作用? 解决方案 即放在函数 ..
发布时间:2022-01-17 14:18:27 其他开发

存储到内存和从内存中加载是如何工作的;存储 32 位字时,哪些地址会受到影响?

我正在从事一个二进制分析项目,我正在构建一个将程序集转换为 llvm 的升降机.我建立了一个内存模型,但对 str 和 ldr arm 汇编指令如何在内存上工作有点困惑.所以我的问题是.例如,给定一个内存地址 0000b8f0,我想在其中存储一个 64 位十进制值 20000000.str 指令是将整个 20000000 存储在地址 0000b8f0 中还是将其划分为字节并将第一个字节存储在 00 ..
发布时间:2022-01-17 14:17:12 其他开发