我想在我的代码中计算几个cpu指令.例如,我想知道有多少次添加,多少次乘法,多少次浮点运算,我的代码执行了多少个分支.我目前在Linux下使用gprof来分析我的c ++代码,但它只给出了对我的函数的调用次数,并且我手动估计了指令的数量.是否有任何工具可以帮助我?也许是一些虚拟机?
我为 Intel 8080 编写了一个模拟器,我想检查我实现的指令是否正确。是否有测试套件或方法来测试每条指令是否正确?
我的模拟器是用 C 编写的。
我刚开始使用SS2优化图像处理,但对于3通道24位彩色图像却不知情.我的pix数据由BGR BGR BGR ...排列,unsigned char 8-bi,所以如果我想用SSE2/SSE3/SSE4的C/C++指令实现Color2Gray,我该怎么办?是否需要对齐我的像素数据(4/8/16)?我读过文章:http://supercomputingblog.com/windows/image-processing-with-sse/ 但它是ARGB 4通道32位颜色,每次都精确处理4色像素数据.谢谢!
//Assume the original pixel:
unsigned char* pDataColor=(unsigned char*)malloc(src.width*src.height*3);//3
//init pDataColor every pix val
// The dst pixel:
unsigned char* pDataGray=(unsigned char*)malloc(src.width*src.height*1);//1
Run Code Online (Sandbox Code Playgroud)
// RGB->灰色:Y = 0.212671*R + 0.715160*G + 0.072169*B.
我是一个在广阔的装配世界中的完全初学者,在学习的过程中,我遇到了一个奇怪的事情.
条件跳转是在标志检查的基础上完成的,以查看某些运算符如何比较.但是,似乎有两种不同的方法来进行检查.几乎每个条件跳转指令,似乎都有一个完全相同的对应物,只是用不同的符号.例如,je
似乎是相同的jz
.据我所知,如果在指令设置零标志之前比较两个操作数,这两条指令都会跳转.这里的说明有什么区别.一个比另一个更有效吗?是否会产生更多开销?区别仅在于可读性吗?
还有一些其他说明似乎也是一样的:
loopz
/loope
jb
/jc
jnz
/jne
我想在获取下一条指令之前修改它,在foo 函数中的这篇文章的最佳答案中,*p
指向 main 函数中的下一条指令。我想修改where*p
指向的内容。例如我想将下一条指令更改为跳转指令。我怎样才能做到这一点?
void foo()
{
void** p = search((void**)&p, __builtin_return_address(0));
// modify content of where *p points at.
}
int main()
{
foo();
//next instruction. *p points here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想在 intel Core-i7 3632QM 处理器上使用 gcc 编译器来执行此操作。
本页代码部分的第二条指令:
看起来像这样:MOV r9d, 0
。编码如下:41 B9 00 00 00 00
唯一的问题是... Intel x64 手册中没有任何MOV
指令可以获取 4 字节立即数并将其放入 64 位寄存器中。
这些是英特尔手册中的说明:
B0+ rb MOV r8, imm8 Move imm8 to r8.
REX + B0+ rb MOV r8***, imm8 Move imm8 to r8.
B8+ rw MOV r16, imm16 Move imm16 to r16.
B8+ rd MOV r32, imm32 Move imm32 to r32.
REX.W + B8+ rd MOV r64, imm64 OI Valid N.E. Move imm64 to r64.
Run Code Online (Sandbox Code Playgroud)
该指令似乎有效,但是如何呢?
我不明白SBC
和RSC
ARM指令
我知道两者都处理进位标志(C)
我认为用进位 ( ADC
)添加结果是有意义的,例如:
ADC r1, r2, r3 @ r1 = r2 + r3 + Carry
Run Code Online (Sandbox Code Playgroud)
但是用进位减法/反向减法……我不明白发生了什么:(
你们能给我一个使用SBC
and的例子RSC
吗?
我一直对此感到好奇,因为压缩几乎用于所有事物。
典型的现代CPU芯片的硅片上是否有任何基本的压缩支持说明?
如果没有,为什么不包括在内?
为什么这与加密不同?在加密中,某些CPU对AES等算法具有硬件支持?
我知道在组装时必须非常小心,即这样做:
mov ah, 10h
mov al, 00h ; dividend = 1000h
mov bl, 10h ; divisor = 10h
div bl ; Integer overflow exception, /result 100h cannot fit into al
Run Code Online (Sandbox Code Playgroud)
我已经编写了一些可能不可靠的逻辑来为除法创建一个更友好的环境:
mov ah, 10h
mov al, 00h
mov bl, 10h
TryDivide:
cmp bl,ah
jna CatchClause
div bl
clc
jmp TryEnd
CatchClause:
stc
TryEnd:
Run Code Online (Sandbox Code Playgroud)
有没有人知道类似这样的事情没有实现的技术原因,我们有例外而不是标志设置/寄存器被截断?
instructions ×10
assembly ×7
c ×2
x86 ×2
arm ×1
c++ ×1
carryflag ×1
comparison ×1
emulation ×1
gcc ×1
intel-8080 ×1
machine-code ×1
opencv ×1
optimization ×1
profiling ×1
sse2 ×1
test-suite ×1
time ×1
x86-64 ×1