我试图通过迄今为止所有的sse补充,从旧的386基本指令学习最新的x86汇编.
我读了一些像SSE5这样的东西有170个新指令 - 我被催促知道它们目前有多少.
有些人可能会说它很难计算(因为它们中的一些很接近,但是在不同的类型参数上工作),但我认为它们可以通过一些合理的假设来计算如何将倍数计算为1.那么有人可以提供答案吗?
最好的答案是每个处理器扩展中有多少指令的表.
立方贝塞尔长度的解析解似乎不存在,但这并不意味着不存在编码廉价解的编码.便宜我的意思是在50-100 ns(或更少)的范围内.
有人知道这样的事吗?可能分为两类:
1)较少的错误,如1%但更慢的代码.2)更多错误如20%但更快?
我通过谷歌扫描了一下,但它没有找到任何看起来像一个很好的解决方案.只有像划分N个线段并将N sqrt相加的东西 - 太慢以获得更高的精度,并且对于2或3个段可能太不准确.
有更好的吗?
前段时间我正在尝试编写汇编程序并将其与C程序链接,我发现我可以跳过标准的C调用序言尾声
push ebp
mov ebp, esp
(sub esp, 4
...
mov esp, ebp)
pop ebp
Run Code Online (Sandbox Code Playgroud)
只是跳过这一切,然后点击esp,就像
mov eax, [esp+4] ;; take argument
mov [esp-4], eax ;; use some local variable storage
Run Code Online (Sandbox Code Playgroud)
它似乎工作得很好.为什么使用这个ebp - 可能通过ebp更快或更快地解决?
我有 16 字节的“字符串”(它们可能更短,但您可能会假设它们在末尾用零填充),但您可能不会假设它们是 16 字节对齐的(至少不总是)。
如何编写一个例程将它们与 SSE 内在函数进行比较(是否相等)?我发现这个代码片段可能会有帮助,但我不确定它是否合适?
register __m128i xmm0, xmm1;
register unsigned int eax;
xmm0 = _mm_load_epi128((__m128i*)(a));
xmm1 = _mm_load_epi128((__m128i*)(b));
xmm0 = _mm_cmpeq_epi8(xmm0, xmm1);
eax = _mm_movemask_epi8(xmm0);
if(eax==0xffff) //equal
else //not equal
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下或者写一个函数体吗?
它需要在 GCC/mingw 中工作(在 32 位 Windows 上)。
如果你组装一个PE(.exe,Win32的可移植可执行文件)文件,它有一个你可以调用的入口点_start,_main或者你喜欢的任何东西.
问题是 - 这个入口点是否带有一些args?如果是这样,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?我在哪里可以找到关于此的一些文档?
C语言有签名和无符号类型,如char和int.我不确定,它是如何在汇编级别实现的,例如在我看来,有符号和无符号的乘法会带来不同的结果,因此汇编执行无符号和有符号算术或仅执行一次,这在某种程度上是模拟的不同的情况?
我正在 MinGW 中为 WinAPI 编码
我还没有完全理解的一件事是 VC 可再发行版,我对它有一大堆问题
有人说,此类计划需要msvcrt.dll
我发现这里有问题,因为我想生成不依赖的小exe,只调用系统WinAPI,如果我使用一些类似C标准库函数的函数,我更喜欢它经济地和静态地编译,而不是任何第三方依赖项
我知道有些函数sin cos min max memcpy可能不被视为普通函数,而是可能被内置函数替换(当替换是(一个)实际的处理器指令时,这可能比仅仅内联函数调用更优化,例如为带浮点单元的 x86 编译时直接调用FSIN标准sin函数的指令)。
我想使用内置函数的强大功能(在 C/C++ 中,主要是在 mingw/gcc 中可能是其他编译器),但我不想链接到标准 C 库 libc)。
是否可以在不链接到 libc 的情况下使用内置函数?
它们是否需要将这些符号优化为内置函数所需的任何命令行标志?
(与之前有关,但改写了)
它们会被名称自动识别,还是需要编译器标志才能使用内置函数?
假设我没有导入.lib库,我希望通过手动编写调用(如汇编或纯c)中的所有操作
GetProcAdress LoadLibrary是winapi dll的一部分一般来说,加载dll并获取指向函数的指针,我需要调用这两个,但是因为我没有得到它们我可以使用它来获取它们?
这有点像悖论,可能它可以通过其他一些机制解决,但在这里我缺乏知识表明,我不知道这个机制是什么,有人能解释一下吗?
在反汇编/转储exe时,我在.idata导入部分中得到三个表:
我理解IAT和INT是什么,但更准确的是什么?
有人可以提供解释,因为各种PE教程令人困惑.我并不完全理解他们描述的这些官方结构名称在这个特定数据上的位置.
这里的提示/答案会有所帮助
示例PE文件部分
SECTION .idata align=4 noexecute ; section number 3, data
Import_table: ; dword
db 50H, 30H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403000 _ P0......
db 00H, 00H, 00H, 00H, 0ACH, 30H, 00H, 00H ; 00403008 _ .....0..
db 68H, 30H, 00H, 00H, 58H, 30H, 00H, 00H ; 00403010 _ h0..X0..
db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ; 00403018 _ ........
db 0C0H, 30H, 00H, 00H, 70H, 30H, 00H, …Run Code Online (Sandbox Code Playgroud) winapi reverse-engineering coff disassembly portable-executable
至于今天我使用我自己的min()函数(for float和int)基于if但是今天我知道x86有一些操作数为min - 这是
MINSS - 操作数的最小值
我认为如果基于min()例程是有效的并且我非常小心优化,所以我想将自己的例程重写为minss带有内联汇编的版本,
我想找到gcc内联汇编中最有效的版本如何
我需要类似的东西
int min(int a, int b)
{
// minss a, b
//return
}
Run Code Online (Sandbox Code Playgroud)
两个int和float,使用minss操作码和具有最小的序幕和尾声
或者只是使用库版本会更快?虽然我不想使用库min/max并尽可能快地使用它
有没有一种在32 x86机器上使用64位整数的快速方法(在c(添加:和c ++)语言编译器中)?
32位x86在某种程度上支持64位操作(旧mmx中有一些movq指令,可能还有其他一些命令),但如何从c中使用它?
如果有人想在32位x86机器上使用64位int算术怎么办 - 如何最简单有效地完成?
//编辑
到现在为止我找到了一些候选人
uint64_t A;
long long a;
int64 a;
__int64 a;
Run Code Online (Sandbox Code Playgroud)
应该用什么?是否有可能某些上述关节炎的实施比其他更好/更快?
我将双三次贝塞尔曲线存储为 16float3点
float3 bezier[16];
Run Code Online (Sandbox Code Playgroud)
这是 4 组,每组 4 点
{A4 B4 C4 D4} // 4th curve
{A3 B3 C3 D3} //3rd curve
{A2 B2 C2 D2} //2nd curve
{A1 B1 C1 D1} //1st curve
Run Code Online (Sandbox Code Playgroud)
好吧,我评估给定位置t, p(t)从t到 的0.0点1.0。这很容易。我使用这一点,例如:
{1st curve point p0(t=0 ) , 2nd curve point p1(t=0 ), 3rd p2(t=0 ), 4th p3(t=0 ) }
{1st curve p0(t=0.1) , 2nd p1(t=0.1), 3rd p2(t=0.1), 4th p3(t=0.1) }
Run Code Online (Sandbox Code Playgroud)
评估和绘制“正交”(横向)曲线。
我无法理解一件事,第一条基本曲线的控制点 …