有人请告诉我这个代码有什么问题我只是从kernel32.dll调用Sleep函数有什么问题?我正在使用Visual Studio 2008.任何帮助都将不胜感激.非常感谢你.
__asm
{
mov eax, 77e2ef66h
push 9999
call eax
}
Run Code Online (Sandbox Code Playgroud) 我读完了 PC 汇编语言,我正在研究汇编中 RC4 加密的实现。我无法理解的是为什么
mov eax, [edx+ecx]
Run Code Online (Sandbox Code Playgroud)
有效但
mov eax, [edx-ecx]
Run Code Online (Sandbox Code Playgroud)
没有。内联汇编器给了我这个错误信息,
“第二个操作数”中的非常量表达式
这意味着什么?提前致谢。
char name[25];
int generated_int;
for(int i = 0; i<sizeof(name); i++)
{
name[i] = (char)0;
}
cout << "Name: ";
cin >> name;
int nameLen = strlen(name);
__asm
{
pusha;
mov esi, &name //I got error here, I cant use "&". How to move name address to esi?
mov ecx, nameLen
mov ebx, 45
start:
mov al, [esi]
and eax, 0xFF
mul ebx
inc esi
add edi, eax
inc ebx
dec ecx
jnz start
mov generated_serial, edi
popa
}
cout << …Run Code Online (Sandbox Code Playgroud) void myfun1(char *str) {
push ebp
mov ebp,esp
char buffer[16];
sub esp,0x18
strcpy(buffer, str);
mov eax,DWORDPTR [ebp+8]
mov DWORD PTR [esp+4],eax
lea eax,[ebp-16]
mov DWORD PTR [esp],eax
call 0x80482c4 <strcpy@plt>
myfun2(buffer);
lea eax,[ebp-16]
mov DWORD PTR [esp],eax
call 0x80483b4 <myfun2>
}
leave
ret
Run Code Online (Sandbox Code Playgroud)
如果你们中的任何人也可以为我解释这段代码..我是汇编的初学者..
我的要求是通过使用内联汇编偏移rbp来访问函数调用参数。但是我找不到合适的操作数约束来指定x86中的基本指针。我使用的是Intel编译器,但文档说明它支持GCC样式内联汇编。因此,基于GCC的示例就足够了。
这是设置:我正在使用 LLVM,并且我有一个分析过程,需要使分析的一些结果可供以后使用。这些结果需要在我生成的最终 .s 文件(ARM 架构)中可见。然后我在 .s 文件上运行一些脚本,这些脚本使用这些结果做进一步分析,但也依赖于生成的 ASM 的实际结构(否则我只会使用更多的 LLVM 传递)。
最初我认为元数据就是我想要的,我创建了一些简单的测试函数来为我关心的每条指令插入一些元数据。但我不知道如何使这个元数据反映在最终的 .s 文件中。更糟糕的是,我无法弄清楚如何使元数据字符串成为我真正想要的。您将在下面看到的“5”永远不会输出。相反,我在输出中看到 46 或 47。
void addMetadata(Instruction& I) {
LLVMContext& C = I.getContext();
MDNode* N = MDNode::get(C, MDString::get(C, "5"));
I.setMetadata("alias_set", N);
std::cerr << "Instruction" << std::endl;
I.dump();
}
Run Code Online (Sandbox Code Playgroud)
示例输出:
Instruction
%30 = load i32* %29, align 4, !dbg !67, !alias_set !46
Run Code Online (Sandbox Code Playgroud)
我也听说内联汇编可能会起作用,但我不知道这是否允许我在特定的 IR 指令之前插入注释或标签。如果 IR 被重新排序,那么无论它走到哪里,该标签或评论都需要跟随它。基本上,我只想在 .s 文件中看到一个标签或评论,其中包含一些我想要的少量信息。有谁知道这是怎么做到的吗?谢谢!
我的问题是为什么 C# 编译器不允许内联 C# MSIL 函数。我知道在某些情况下 JIT 会内联实际的 X86 程序集,但我询问的是实际的 MSIL“程序集”代码。
为什么 C# 编译器不提供这些类型的优化?
是不是因为收益很小甚至没有收益?或者它根本没有实施?
内联汇编代码替换其中一个for循环中的C++语句.
有时它神奇地工作并产生正确的结果 - 使用基数排序排序的数组.另一次Xcode生成一个Thread 1: EXC_BAD_ACCESS (code=1, address=0x1eccccccccd)错误,我incq (%[count], %%rdx, 4)使用反汇编视图追溯到行.
我的理解
反汇编视图incq (%[count], %%rdx, 4)为incq (%rax,%rdx,4).这可能意味着相同的寄存器用于不同的操作数(%%rax已在线使用movq (%[array], %%rcx, 4), %%rax),问题在于此处:: [array] "r" (array), [count] "r" (count), "b" (digit), "c" (i).
我不明白的是
如何管理寄存器,以便我可以使用足够的寄存器(分配给输入操作数以及后面的正文代码)并且它们不会同时重叠.我尝试了几种组合,但没有一种有效.
void countingSort(int array[], int length, int digit) {
int i, count[10] = { };
int sorted[length];
// Store number of occurrences in count[].
// for (i = 0; i < length; i++)
// …Run Code Online (Sandbox Code Playgroud) 我想检查我的代码的CPU周期.
我想用'tsc'.
在这种情况下,许多tsc代码包含'_emit 0Fh,_emit 31h'.
这些的确切含义是什么?
这是代码.
#include <stdio.h>
#include <windows.h>
union int32to64
{
__int64 i64;
int i32[2];
};
void read_tsc(int *cl_Low, int *cl_High)
{
__asm {
_emit 0Fh
_emit 31h
mov ecx, dword ptr cl_Low // cl_Low -> ecx into 32bit
mov[ecx], eax
mov ecx, dword ptr cl_High
mov[ecx], edx
}
};
int main(void)
{
union int32to64 a, b;
__int64 mhz = 0;
read_tsc(&a.i32[0], &a.i32[1]);
Sleep(1000);
read_tsc(&b.i32[0], &b.i32[1]);
mhz = b.i64 - a.i64;
printf("clock : %I64dMHz", mhz / 1000000); …Run Code Online (Sandbox Code Playgroud) 有人可以帮助我理解unsigned long long在性能方面使用asm块进行乘法的好处.它与竞争性编程优化有关.我想它会使乘法更快,但我实际上无法理解代码.
const int md = 998244353;
inline int mul(int a, int b)
{
#if !defined(_WIN32) || defined(_WIN64)
return (int) ((long long) a * b % md);
#endif
unsigned long long x = (long long) a * b;
unsigned xh = (unsigned) (x >> 32), xl = (unsigned) x, d, m;
asm(
"divl %4; \n\t"
: "=a" (d), "=d" (m)
: "d" (xh), "a" (xl), "r" (md)
);
return m;
}
Run Code Online (Sandbox Code Playgroud)