您如何计算指令的执行时间?是否仅通过检查芯片制造商在完成一个动作可能需要多少个时钟周期之后说的话就可以完成?我还有其他应该知道的吗?感觉我想念一些东西...
从 NSIS 文档中,我们有
root_key subkey key_name
此属性告诉安装程序检查注册表中的字符串,如果该字符串有效,则将其用于安装目录。如果存在此属性,并且注册表项有效,它将覆盖 InstallDir 属性,否则它将回退到 InstallDir 默认值。
所以,如果我在.nsi
文件中有这些行:
InstallDir "D:\myFolder\myFile"
InstallDirRegKey HKCU "Software\${PRODUCT_COMPANY}\${PRODUCT_NAME}" "Install_Dir"
Run Code Online (Sandbox Code Playgroud)
我知道我将安装目录设置为D:\myFolder\myFile
默认目录,但如果Software\${PRODUCT_COMPANY}\${PRODUCT_NAME}
是有效路径,那么我将使用它。那是对的吗?
从另一篇文章中,我了解到该InstallDirRegKey
指令用于覆盖同一位置的先前安装。它如何更精确地工作?如果我有以下情况,
InstallDir "D:\myFolder\myFile"
InstallDirRegKey HKCU "D:\myFolder\myFile" "Install_Dir"
Run Code Online (Sandbox Code Playgroud)
.exe
NSIS 脚本生成的新文件会覆盖之前的文件吗?或者这是否意味着可执行文件将覆盖前一个文件?
我刚刚开始学习微控制器,我无法理解如何在不使用定时器的情况下在代码中引入延迟.我的主板有16MHZ的时钟.假设我想在检查是否按下按钮之前引入5ms延迟.我如何确定需要执行多少指令才能获得5 ms的延迟以及如何对其进行编程?这样做有标准化的方法吗?它看起来像一个非常标准的东西,但我无法理解它是如何完成的.
我在Atmega 328 Arduino uno上使用汇编语言进行编程.
在64位linux上学习GAS汇编.许多教程都是针对32位汇编的.
很难通过x86_64程序集进行丛林攻击.
当我用gcc编译ac程序时,我仍然看到一些%eax
和movl
.
我主要玩int32_t
.
但我认为必须使用64位指令x86_64
(如rax
,rbx
等等).
我不太了解.他们不应该%rax
和movq
?在我的装配程序中,我应该使用movq
,对吧?即使是32位整数?我是一个迷失的初学者.
谢谢
我找不到关于ldrd的任何合理解释.什么会在r2中结束,在r3中会是什么? ldrd r2,r3,[r1]
我想测试按位运算是否真的比算术运算更快.我以为他们是.
我写了一个小的C程序来测试这个假设,令我惊讶的是,加法平均比按位AND运算少.这对我来说是令人惊讶的,我无法理解为什么会这样.
根据我所知的附加,来自较低有效位的进位应该被携带到下一位,因为结果也取决于进位.对我来说逻辑运算符比加法更慢是没有意义的.
我的鳕鱼在下面:
#include<stdio.h>
#include<time.h>
int main()
{
int x=10;
int y=25;
int z=x+y;
printf("Sum of x+y = %i", z);
time_t start = clock();
for(int i=0;i<100000;i++)z=x+y;
time_t stop = clock();
printf("\n\nArithmetic instructions take: %d",stop-start);
start = clock();
for(int i=0;i<100000;i++)z=x&y;
stop = clock();
printf("\n\nLogic instructions take: %d",stop-start);
}
Run Code Online (Sandbox Code Playgroud)
一些结果:
Arithmetic instructions take: 327
Logic instructions take: 360
Arithmetic instructions take: 271
Logic instructions take: 271
Arithmetic instructions take: 287
Logic instructions take: 294
Arithmetic instructions take: 279
Logic instructions take: …
Run Code Online (Sandbox Code Playgroud) c assembly instructions logical-operators integer-arithmetic
使用说明sra
和使用srl
说明时有什么变化?我无法理解两者之间的区别。使用的语言是 MIPS 汇编语言。
sll $t1,$t0,2
sra $t2,$t0,2
sll $t1,$t0,2
srl $t2,$t0,2
Run Code Online (Sandbox Code Playgroud) 我正在阅读一本教科书,其中有一个基于 C 代码生成汇编代码的练习:
代码:
long arith(long x, long y, long z)
{
long t1 = x ^ y;
long t2 = z * 48;
long t3 = t1 & 0x0F0F0F0F;
long t4 = t2 - t3;
return t4;
}
Run Code Online (Sandbox Code Playgroud)
汇编代码:
//x in %rdi, y in %rsi, z in %rdx
arith:
xorq %rsi, %rdi //t1 = x ^ y
leaq (%rdx,%rdx,2), %rax //3*z
salq $4, %rax //t2 = 16 * (3*z) = 48*z
andl $252645135, %edi //t3 = t1 & 0x0F0F0F0F …
Run Code Online (Sandbox Code Playgroud) assembly bit-manipulation x86-64 instruction-set instructions
我在 x64 上用汇编编程,我打算在堆栈中推送一个地址。我打算编写push %rsp
,但是,由于此指令更改了 的值%rsp
,我不确定将推送什么值。
具体来说,如果我运行以下命令:
movq $0x10, %rsp
pushq %rsp
Run Code Online (Sandbox Code Playgroud)
内存地址是否0x8
包含0x10
或0x8
?这个处理器是依赖的还是所有 x64 处理器的标准?
大多数英特尔处理器都有2个负载单元和1个存储单元.商店单位也是一个负载单位吗?指令/微操作是修改现有的存储器数据,例如inc [memory]
只使用1个存储单元,其余2个负载单元可用于可在相同周期内执行的其他微操作/指令,或者指令如inc
1个负载单元(加载现有值)加1个存储单元(存储新值)所以我们只剩下一个加载单元?因此,保持2个负荷单位供选择,我们就可以完全存储指令一样mov
,push
等?
instructions ×10
assembly ×9
x86-64 ×4
64-bit ×1
arduino-uno ×1
arm ×1
bit-shift ×1
build ×1
c ×1
callstack ×1
delay ×1
execution ×1
installation ×1
intel ×1
mips ×1
nsis ×1
performance ×1