instruction-set相关内容
首先我对 movq 和 movabsq 之间的区别有点困惑,我的教科书说: 常规 movq 指令只能具有可以表示为 32 位二进制补码的直接源操作数.然后对该值进行符号扩展以生成目标的 64 位值.movabsq 指令可以将任意 64 位立即数作为其源操作数,并且只能将寄存器作为目标. 我有两个问题. 问题 1 movq 指令只能有可以表示为 32 位二进制补码的立即数源操
..
我想知道在汇编中是否允许这样做, movl (%edx) (%eax) 我猜它会访问第一个操作数中的内存并放入第二个操作数的内存,比如 *a = *b 但我没有看到任何处理这样的例子,所以我猜这是不允许的.另外,我被告知这是不允许的 leal %esi (%edi) 这是为什么?最后,是否还有其他类似的功能我应该知道是不允许的. 解决方案 movl (mem), (mem)mo
..
我想知道这些说明有什么区别: MOV AX, [表地址] 和 LEA AX, [表地址] 解决方案 LEA 表示加载有效地址 MOV 表示加载值 简而言之,LEA 加载指向您正在寻址的项目的指针,而 MOV 加载该地址的实际值. LEA 的目的是允许一个人执行非平凡的地址计算并存储结果[供以后使用] LEA ax, [BP+SI+5] ;计算值的地址MOV ax, [BP
..
我最近接触到了链接寄存器和叶函数的概念. 我从之前的 SO 读取中了解到,LR 告诉了代码之前在执行期间的位置.我还了解到叶函数是位于函数调用层次结构末尾的函数. ARM 维基百科页面说: 链接寄存器支持快速叶函数调用. 为什么这个说法是真的?我看了ARMARM(架构参考手册),关于链接寄存器的信息很少. 解决方案 在一些体系结构上(例如 x86、x86_64),函
..
如标题所述,为什么 ARM 指令集仅在除法时区分有符号和无符号? SDIV 和 UDIV 可用,但 ADD、SUB 和 MUL 不是这种情况. 解决方案 相同大小的有符号数和无符号数的加法和减法在二进制补码数学(ARM 使用)中产生完全相同的位模式,因此不需要用于单独的说明.例如,如果我们采用字节大小的值: 0xFC +4签名:-4+4 = 0无符号:252 +4 = 256 =
..
我不太想知道在每个平台上开发代码时程序员习惯的或他觉得更容易做的事情等方面的“小字"差异.我也对细节不感兴趣核心的物理差异(如果适合您的叙述,我不介意提及它们,我只是不想关注上述内容) 我只是在寻找为什么像 x86 这样的 CISC 架构优于 RISC 架构,或者不是? 我的意思是,如果您可以通过降低复杂性 (RISC) 来做所有事情,那么为什么要成为“复杂"(CISC) 有什么
..
在“ARM11TechnicalRefManual"第 1-34 节的“The Thumb 指令集"下,它说: “Thumb 指令集是最常用的 32 位 ARM 指令的子集.Thumb 指令有 16 位长,并有相应的 32 位 ARM 指令,对处理器模型具有相同的影响." 谁能解释更多关于这尤其是第二句话并说处理器如何执行它? 解决方案 ARM 处理器有 2 个指令集,传统的
..
我想了解 Q 标志在 ARM 处理器中的重要性.我知道有一些指令,如 QADD、QSUB 等. 但我需要通过一些例子来理解这一点,这将阐明这个概念. 请解释一下. 谢谢 解决方案 这在《ARM 架构参考手册》(ARM DDI 0100E) 中有解释: CPSR 的 位[27] 是一个粘性溢出 标志,也称为 Q 标志.如果发生以下任一情况,则此标志设置为 1: Q
..
这是什么意思:我只有 12 位的立即数,所以我可以只表示 0 到 2^12 = 4096 的立即数吗?操作数 2 ,如果它是一个寄存器,可以有 32 位,但为什么立即常量只有 12 位?这个数字是从哪里来的? 解决方案 它由指令集定义.例如.MOV 指令被编码为 31 28 |27 26 |25 |24 23 22 21 20 |19 16 |15 12 |11 0 |条件 |0 0 |
..
我阅读了几篇文章,其中包括 SO 为什么 ARMPC寄存器指向下一条要执行的指令之后的指令?,那个pc寄存器的值实际上是当前执行指令地址加上前面的2条指令,所以在ARM状态下是+8字节(2*32bits).> 我的问题是,对于拇指状态,可能有 16 位或 32 位指令,这是否意味着对于 16/32 位指令,获取 pc 地址可以分别是 +4 字节或 +8 字节的偏移量? 例如: 279ae
..
最近我检查了 ARM Cortex-M3 处理器的指令集.例如: ADD 、、 这些缩写到底是什么意思?我猜他们的意思是不同类型的地址,比如直接寻址、相对寻址等等.但究竟是什么? 谢谢! 解决方案 基础: Rd 是目的地,Rn 和 Rm 是来源.它们都是通用的整数寄存器;FP 将使用 Sd/Sn/Sm 或 Dd/Dn/Dm 单人或双人. ARM 语法将目标放在左侧,在只读
..
下面这行代码在arm assembly中做了什么: 000031e6 2916 cmp r1,#22000031e8 bf1a itte ne 我得到了第一行(比较 r1 和 22)但是第二行呢(我以前从未见过 itte 命令并且谷歌搜索没有返回任何内容) 解决方案 是 ARM 的 IF-THEN-ELSE 指令,在 Thumb-2 指令集中引入.(根据您上面的具体示例,如果您已经
..
在(32 位)ARM Linux 内核中,如何区分嵌入在代码部分的数据和指令? 最好有一个轻量级的方法,比如位掩码,它可以很容易地实现.将反汇编程序嵌入内核是不明智的. 解决方案 一般来说,你所要求的是不可能的. 考虑一下这个函数,它碰巧使用了太大而无法编码为立即数的数据值: @void patch_nop(void *code_addr);patch_nop:ldr r1,
..
我正在研究 Cortex-A8 和 Cortex-A9.我知道有些架构没有整数除法,但是除了转换为浮点数、除法、转换为整数之外,最好的方法是什么?或者这确实是最好的解决方案? 干杯!=) 解决方案 编译器通常在其库中包含一个除法,例如 gcclib 我从 gcc 中提取它们并直接使用它们: https://github.com/dwelch67/stm32vld/ 然后是 st
..
ARM 程序集具有进入“主管模式"的 SWI 和 SVC 指令. 让我困惑的是,为什么有两个?这里 据说SVC以前是西威.这是否意味着他们基本上改变了助记符?它们是一样的吗?我可以互换使用它们吗?其中一个存在于架构之前,另一个存在于架构之后吗? 解决方案 是的,SWI 和 SVC 是一回事,只是改名而已.以前,SVC 指令称为 SWI,即软件中断. SVC(和 SWI)的操作码
..
如果我是对的,ISA 是机器中的指令集语.那么 ISA 0/1 二进制序列中的指令是什么? 为什么我看到 ISA 中的指令是人类可读的文字图书? 是代表指令的人类可读的单词吗?ISA 与汇编语言中使用的助记符相同伊萨? 是 ISA 部分中指令的人类可读的单词吗?ISA? 如果是,是否有从人工翻译的翻译过程ISA 中的可读指令到机器语言,就像汇编程序将汇编语言翻译成机器语言?
..
在(32 位)ARM Linux 内核中,如何区分嵌入在代码部分的数据和指令? 最好有一个轻量级的方法,比如位掩码,它可以很容易地实现.将反汇编程序嵌入内核是不明智的. 解决方案 一般来说,你所要求的是不可能的. 考虑一下这个函数,它碰巧使用了太大而无法编码为立即数的数据值: @void patch_nop(void *code_addr);patch_nop:ldr r1,
..
我被告知 lea %rax, %rdx 是无效的语法,因为来源需要在括号中,即 lea (%rax), %rdx 我想我显然误解了 lea 和括号的用途. 我认为 lea %rax, %rdx 会将存储在 %rax 中的内存地址移动到 %rdx,但显然这就是 lea (%rax), %rdx 所做的? 令我困惑的是,我认为括号表示访问内存中的地址,并获取该地址处的值.因此,通过使
..
在 Intel 和 AMD x86_64 处理器上,SIMD 矢量化寄存器具有特定的融合乘加功能,但通用(标量、整数)寄存器不要 - 你基本上需要相乘,然后相加(除非你能把东西放进一个lea). 这是为什么?我的意思是,它是无用的以至于不值得开销吗? 解决方案 整数乘法很常见,但不是整数乘法最常见的事情之一.但是对于浮点数,乘法和加法一直在使用,而 FMA 为大量 ALU 绑定的 F
..
可以安全地假设 x64 构建可以使用 TZCNT 不通过 cpu 标志检查其支持? 解决方案 不,当然不是!x86-64 是 2003 年末 (AMD K8) 的新版本,只有旧的 bsf 和 bsr 位扫描指令,没有 BMI1 的其余部分. 第一个支持 BMI1 的 Intel CPU 是 2013 年的 Haswell.(同时引入了 BMI2.) 第一个支持 BMI1 的 AMD
..