assembly相关内容

指令对汇编语言中的操作数做了什么?

‘and’指令在汇编语言中做什么?我被告知它检查操作数的位顺序,并将1设置为True,其他任何值设置为False,但我不知道它实际做了什么,也不知道它对代码有什么影响。 推荐答案 AND指令以以下方式比较两个操作数中的位: Bit position 1234 5678 Operand A -- 1101 1001 Operand B -- 1001 0111 ..
发布时间:2022-06-10 15:13:29 其他开发

让现代CPU保持标志更新是否需要花费大量资源?

据我所知,在现代无序CPU上,最昂贵的东西之一是状态,因为该状态必须在多个版本中进行跟踪,并在许多指令等方面保持最新。 一些指令集,如x86和ARM,广泛使用标志,这是在成本模型不是今天的时候引入的,标志只需要几个逻辑门。类似于每条算术指令设置标志以检测零、进位和溢出。 更新现代无序实现的成本是否特别高?使得例如ADD指令更新进位标志,并且这必须被跟踪,因为尽管它可能永远不会被使用,但是有 ..

为什么ARM LSL和LSR的允许移位值范围不同?

为什么LSL[0,31]允许移位值,而LSR允许移位值是[1,32]? LSL中的0位移位对任何应用程序都有什么用处?为什么在LSR中不允许0班次?为什么LSL不允许32位移位? 推荐答案 此限制适用于按立即数进行的班次。按寄存器移位不受此类限制。 LSL允许为0表示“不换档”。这是一个特例,因为不修改标志设置指令的C标志。 LSR和ASR乘以0的行为与LSL乘以0的行为 ..
发布时间:2022-05-31 23:33:30 其他开发

如何更改程序集中变量的值

我正在为我的MikeOS端口编写一些代码。它是用NASM x86 16位汇编编写的。我正在尝试将我设置的变量更改为不同的值。它编译时没有错误,但当我调用os_print_string时,它会打印一些奇怪的ASCII字符。代码如下: BITS 16 ORG 32768 %INCLUDE "mikedev.inc" start: mov si, test2 ..
发布时间:2022-05-25 13:30:49 其他开发

利用时钟中断产生随机数

我需要生成5个随机数,为此我使用了时钟中断:mov ah,2ch int 21h。我取了毫秒(DL),这应该是随机数。但我得到了5次相同的数字。如果您有使用中断解决问题的其他方法,请帮助。 推荐答案 如果您需要一个小的(伪)随机数,请使用: rdtsc % N ..
发布时间:2022-05-25 13:15:12 其他开发

[[可能]]和[[不太可能]]影响程序汇编的简单示例?

C++20向该语言引入了[[likely]]和[[unlikely]]属性,这些属性可用于允许编译器针对以下情况进行优化:一条执行路径比另一条执行路径更可能或更不可能。 考虑到不正确的分支预测的代价,这似乎是一个在代码的性能关键部分非常有用的功能,但我不知道它实际上会导致编译器做什么。 有没有一段简单的代码,添加[[likely]]和[[unlikely]]属性会更改编译器的程序集输出 ..
发布时间:2022-05-16 18:07:28 C/C++开发

英特尔:序列化指令和分支预测

The Intel Architecture's Developer's Manual(第三卷,第8-26节),内容为: 奔腾处理器和更新的处理器系列使用 分支预测技术,以通过预取 分支指令之前的分支指令的目的地为 被处死。因此,指令执行不是确定性的 在执行分支指令时序列化。 这是什么意思? 听起来真的,真的很糟糕。这听起来像是一条序列化指令,如CPUID中断分支预测(反之亦然) ..
发布时间:2022-05-08 20:44:48 其他开发

英特尔x86-中断服务例程职责

我没有这个词的真正意义上的问题,而是我将尝试澄清一个内容问题。假设我们有一个微内核(PC Intel x86;32位保护模式),对于每个CPU异常,都使用中断描述符表(IDT)和中断服务例程(ISR)。如果出现Division by Zero异常,则ISR调用成功。 global ir0 extern isr_handler isr0: cli push 0x00 ; ..
发布时间:2022-05-08 20:33:59 其他开发

为什么Intel x87寄存器有80位宽?

为什么使用如此“奇怪”的寄存器大小?是否有任何文档说明为什么不建议对这些寄存器使用64位或128位? 推荐答案 Wikipedia page on the IEEE 754-1985 standard关于80位扩展格式有一个很好的解释: 该标准还建议使用扩展格式来执行 内部计算的精度高于 最终结果,以最大限度地减少舍入误差“ 双精度浮点数以64位表示。您可能需要更多的位以获得更 ..
发布时间:2022-05-08 19:29:41 其他开发

基于MCS-51的24位数字乘法算法

我正在尝试用汇编语言为MCS-51 microcontroller和this Datasheet编写程序。 它必须与24位数字相乘。 也许我问了一个愚蠢的问题,但我如何将24位的列相乘? 在下面的图片中说明了16位数字的乘法方法。24位数字的乘法方案会是什么样子? mcs 根据文档快速浏览,推荐答案-51有8x8->16倍。两个24位数字A和B,相当于: A = a ..
发布时间:2022-04-19 16:40:58 其他开发

CAS指令如何保证原子性

根据Wiki,CAS这样做: function cas(p : pointer to int, old : int, new : int) returns bool { if *p ≠ old { return false } *p ← new return true } 嗯,在我看来,如果几个处理器将尝试执行带有相同参数的CAS指令,则可 ..
发布时间:2022-04-18 10:04:14 其他开发

为什么Visual Studio使用xchg AX、AX

我正在查看我的程序的混乱之处(因为它崩溃了),并注意到许多 xchg ax, ax 我谷歌了一下,发现它本质上是NOP,但为什么Visual Studio要做xchg而不是noop? 该应用程序是由Visual Studio编译的C#.NET3.5 64位应用程序 推荐答案 在x86上NOP指令是XCHG AX, AX 这两条助记符指令汇编成相同的二进制操作码。 ..
发布时间:2022-04-17 21:55:49 其他开发

可执行文件是什么样子的?

如果我在十六进制编辑器中打开可执行文件,我会看到十六进制表示法中的1和0吗? 理论上是否有可能为“Hello World”这样的简单程序手动编写可执行文件? 推荐答案 关于第一个问题:是的,您将看到一堆十六进制数字。但任何文件格式都是如此。如果您在十六进制编辑器中打开一个文本文件,您仍然会看到一堆十六进制数字。然而,如果您在文本编辑器(例如记事本)中打开文本文件,您将看到一个文本 ..
发布时间:2022-04-17 11:35:40 其他开发

在跳转目标基于动态环境值的情况下,如何构建控制流图?

在学习逆向工程时,我经常想到,因为我可以传递任何位置(我有权访问)作为参数,带有一些非硬编码或非确定性目标的跳转指令(因为它以前没有由程序明确定义)可以指向任何地方。因此,如果我用EAX加载一个基于比方说操作系统版本的字符串的值并执行jmp eax,那么任何试图生成控制流图的工具似乎都不知道目标在哪里(它可以基于您的当前环境,但这可能会导致程序中的一些中断路径)。 我错过了什么吗?因为如果我 ..
发布时间:2022-04-16 21:13:37 其他开发

保护Python代码免受反向工程的影响

我正在使用Python(2.7)创建一个程序,我想保护它不受反向工程的影响。 我用cx_freeze(提供了基本的安全性--混淆和反调试)编译的 如何添加更多保护,如混淆、打包、反调试、加密识别VM的代码。 我想也许可以加密到负载,然后在运行时解密它,但我不知道如何做到这一点。 推荐答案 一般来说,只要黑客有足够的动机,你几乎不可能让你的程序变得牢不可破。 但您 ..
发布时间:2022-04-16 21:05:46 Python

如何在MOS 6502的ASM中创建延迟

我是ASM新手,我正在尝试解决如何为以下代码创建延迟: org $1000 loop: inc $d021 jmp loop 推荐答案 我想注释已经足够清楚了。 每帧(1/50秒)更改颜色的代码示例 sei ; enable interrupts loop1: lda #$fb ; wait for vertical retr ..
发布时间:2022-04-11 23:55:26 其他开发