assembly相关内容
‘and’指令在汇编语言中做什么?我被告知它检查操作数的位顺序,并将1设置为True,其他任何值设置为False,但我不知道它实际做了什么,也不知道它对代码有什么影响。 推荐答案 AND指令以以下方式比较两个操作数中的位: Bit position 1234 5678 Operand A -- 1101 1001 Operand B -- 1001 0111
..
当我在https://godbolt.org上尝试不同的编译器时,我注意到编译器生成如下代码是非常常见的: push rax push rbx push rcx call rdx pop rcx pop rbx pop rax 我知道每个push或pop做两件事: 将操作数移入/移出堆栈空间 递增/递减堆栈指针(RSP) 因此
..
假设我们有3个比特可以玩。我将在2的补码中表示正负3: +3 = 0b011 -3 = 0b101 执行加法时,当溢出发生时,您总是会遇到一个悬浮位(-3) + (+3): 1 0 1 + 0 1 1 ----- 1 0 0 0 但是减法(-3) - (+3)呢? 1 0 1 - 0 1 1 ----- 0 1 0 0b010为2,这不是我们预期为
..
据我所知,在现代无序CPU上,最昂贵的东西之一是状态,因为该状态必须在多个版本中进行跟踪,并在许多指令等方面保持最新。 一些指令集,如x86和ARM,广泛使用标志,这是在成本模型不是今天的时候引入的,标志只需要几个逻辑门。类似于每条算术指令设置标志以检测零、进位和溢出。 更新现代无序实现的成本是否特别高?使得例如ADD指令更新进位标志,并且这必须被跟踪,因为尽管它可能永远不会被使用,但是有
..
为什么LSL[0,31]允许移位值,而LSR允许移位值是[1,32]? LSL中的0位移位对任何应用程序都有什么用处?为什么在LSR中不允许0班次?为什么LSL不允许32位移位? 推荐答案 此限制适用于按立即数进行的班次。按寄存器移位不受此类限制。 LSL允许为0表示“不换档”。这是一个特例,因为不修改标志设置指令的C标志。 LSR和ASR乘以0的行为与LSL乘以0的行为
..
我正在为我的MikeOS端口编写一些代码。它是用NASM x86 16位汇编编写的。我正在尝试将我设置的变量更改为不同的值。它编译时没有错误,但当我调用os_print_string时,它会打印一些奇怪的ASCII字符。代码如下: BITS 16 ORG 32768 %INCLUDE "mikedev.inc" start: mov si, test2
..
我需要生成5个随机数,为此我使用了时钟中断:mov ah,2ch int 21h。我取了毫秒(DL),这应该是随机数。但我得到了5次相同的数字。如果您有使用中断解决问题的其他方法,请帮助。 推荐答案 如果您需要一个小的(伪)随机数,请使用: rdtsc % N
..
C++20向该语言引入了[[likely]]和[[unlikely]]属性,这些属性可用于允许编译器针对以下情况进行优化:一条执行路径比另一条执行路径更可能或更不可能。 考虑到不正确的分支预测的代价,这似乎是一个在代码的性能关键部分非常有用的功能,但我不知道它实际上会导致编译器做什么。 有没有一段简单的代码,添加[[likely]]和[[unlikely]]属性会更改编译器的程序集输出
..
The Intel Architecture's Developer's Manual(第三卷,第8-26节),内容为: 奔腾处理器和更新的处理器系列使用 分支预测技术,以通过预取 分支指令之前的分支指令的目的地为 被处死。因此,指令执行不是确定性的 在执行分支指令时序列化。 这是什么意思? 听起来真的,真的很糟糕。这听起来像是一条序列化指令,如CPUID中断分支预测(反之亦然)
..
我没有这个词的真正意义上的问题,而是我将尝试澄清一个内容问题。假设我们有一个微内核(PC Intel x86;32位保护模式),对于每个CPU异常,都使用中断描述符表(IDT)和中断服务例程(ISR)。如果出现Division by Zero异常,则ISR调用成功。 global ir0 extern isr_handler isr0: cli push 0x00 ;
..
英特尔recommends使用指令前缀缓解JCC错误的性能后果。 如果使用/QIntel-jcc-erratum编译MSVC,则遵循建议,并插入前缀指令,如下所示: 3E 3E 3E 3E 3E 3E 3E 3E 3E 48 8B C8 mov rcx,rax ; with redundant 3E prefixes They sayMSVC在前缀不可用时求助于NOPS。
..
为什么使用如此“奇怪”的寄存器大小?是否有任何文档说明为什么不建议对这些寄存器使用64位或128位? 推荐答案 Wikipedia page on the IEEE 754-1985 standard关于80位扩展格式有一个很好的解释: 该标准还建议使用扩展格式来执行 内部计算的精度高于 最终结果,以最大限度地减少舍入误差“ 双精度浮点数以64位表示。您可能需要更多的位以获得更
..
我正在尝试用汇编语言为MCS-51 microcontroller和this Datasheet编写程序。 它必须与24位数字相乘。 也许我问了一个愚蠢的问题,但我如何将24位的列相乘? 在下面的图片中说明了16位数字的乘法方法。24位数字的乘法方案会是什么样子? mcs 根据文档快速浏览,推荐答案-51有8x8->16倍。两个24位数字A和B,相当于: A = a
..
根据Wiki,CAS这样做: function cas(p : pointer to int, old : int, new : int) returns bool { if *p ≠ old { return false } *p ← new return true } 嗯,在我看来,如果几个处理器将尝试执行带有相同参数的CAS指令,则可
..
我正在查看我的程序的混乱之处(因为它崩溃了),并注意到许多 xchg ax, ax 我谷歌了一下,发现它本质上是NOP,但为什么Visual Studio要做xchg而不是noop? 该应用程序是由Visual Studio编译的C#.NET3.5 64位应用程序 推荐答案 在x86上NOP指令是XCHG AX, AX 这两条助记符指令汇编成相同的二进制操作码。
..
如果我在十六进制编辑器中打开可执行文件,我会看到十六进制表示法中的1和0吗? 理论上是否有可能为“Hello World”这样的简单程序手动编写可执行文件? 推荐答案 关于第一个问题:是的,您将看到一堆十六进制数字。但任何文件格式都是如此。如果您在十六进制编辑器中打开一个文本文件,您仍然会看到一堆十六进制数字。然而,如果您在文本编辑器(例如记事本)中打开文本文件,您将看到一个文本
..
我是汇编新手,我正在使用MASM。 我看到这些代码行,不知道 a) push myVar b) push [myVar] c) push OFFSET myVar 如何知道他们是否正在推送myVar的值或地址 谢谢! 致以最诚挚的问候 谢谢 推荐答案 push myVar只是将您的var压入堆栈。 push [myVar]正在取消引用您的变量。如果myVar是
..
在学习逆向工程时,我经常想到,因为我可以传递任何位置(我有权访问)作为参数,带有一些非硬编码或非确定性目标的跳转指令(因为它以前没有由程序明确定义)可以指向任何地方。因此,如果我用EAX加载一个基于比方说操作系统版本的字符串的值并执行jmp eax,那么任何试图生成控制流图的工具似乎都不知道目标在哪里(它可以基于您的当前环境,但这可能会导致程序中的一些中断路径)。 我错过了什么吗?因为如果我
..
我正在使用Python(2.7)创建一个程序,我想保护它不受反向工程的影响。 我用cx_freeze(提供了基本的安全性--混淆和反调试)编译的 如何添加更多保护,如混淆、打包、反调试、加密识别VM的代码。 我想也许可以加密到负载,然后在运行时解密它,但我不知道如何做到这一点。 推荐答案 一般来说,只要黑客有足够的动机,你几乎不可能让你的程序变得牢不可破。 但您
..
我是ASM新手,我正在尝试解决如何为以下代码创建延迟: org $1000 loop: inc $d021 jmp loop 推荐答案 我想注释已经足够清楚了。 每帧(1/50秒)更改颜色的代码示例 sei ; enable interrupts loop1: lda #$fb ; wait for vertical retr
..