char* ReadNumericFormat = "%i";
int Read(void)
{
int Storage;
__asm
{
LEA EAX, [Storage]
PUSH EAX
PUSH DWORD PTR [ReadNumericFormat]
CALL DWORD PTR [scanf]
ADD ESP, 8
MOV EAX, DWORD PTR [Storage]
}
}
Run Code Online (Sandbox Code Playgroud)
当用户输入"023919"时,程序返回19.
这是一个功能还是黑暗是一个标准?
装配臂中的这条线有什么作用?
mrc p15, 0, %0, c9, c13, 0" : : "r" (counter)
Run Code Online (Sandbox Code Playgroud)
谁p15不是它应该是r15什么?
what is ::who arec9, c1每个论点的作用是什么?
对于内联asm代码,我__asm用于vc ++编译器和/ __asm__()或asm()构造用于linux下的gcc.(相应的intel/at&t语法)
有没有办法以通用的方式在C中为它们声明内联汇编(x86)?
PS用于结合两者的自动化工具也是可接受的.
几天前,我问了下面的问题.因为我需要快速回答,我补充说:
代码不需要使用内联汇编.但是,我还没有找到使用Objective-C/C++/C指令的方法.
今天,我想学点东西.所以我再次提出问题,使用内联汇编寻找答案.
我想在Objective-C程序中对变量执行ROR和ROL操作.但是,我无法管理它 - 我不是装配专家.
这是我到目前为止所做的:
uint8_t v1 = ....;
uint8_t v2 = ....; // v2 is either 1, 2, 3, 4 or 5
asm("ROR v1, v2");
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
未知使用具有未知大小后缀的指令助记符
我怎样才能解决这个问题?
我有一个分配内存的代码,将一些缓冲区复制到该分配的内存中,然后跳转到该内存地址。
问题是我无法跳转到内存地址。我正在使用gcc,__asm__但无法调用该内存地址。
我想做类似的事情:
address=VirtualAlloc(NULL,len+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
dest=strncpy(address, buf, len);
Run Code Online (Sandbox Code Playgroud)
然后我要在ASM中执行此操作:
MOV EAX, dest
CALL EAX.
Run Code Online (Sandbox Code Playgroud)
我已经尝试过类似的东西:
__asm__("movl %eax, dest\n\t"
"call %eax\n\t");
Run Code Online (Sandbox Code Playgroud)
但这行不通。我该怎么做?
编译时我得到"错误:错误的寄存器名称'%% ecx'"
#include <stdio.h>
int main(void){
asm("mov 3, %%ecx\n\t");
// ...
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在组装中相当新,我很难处理负数
#include <stdio.h>
void main() {
short int mat1[] = {-1,-2, 4,5, 4,-2}; // first array
short int mat2[] = {2,0,0,0, 0,2,0,0}; // second array
int mat3[1024]; // result array
__asm {
MOV AX, mat1[0] ; mat1[0]:= -1
MOV BX, mat2[0] ; mat2[0]:= 2
; my problem is how i can do this
; mat3[0] = mat1[0] * mat2[0] ;
; (operation result -> mat3[0] = -2)
}
}
Run Code Online (Sandbox Code Playgroud)
ps 这是给我的作业提前谢谢
新问题:
尝试一些组装操作后:
MOV AX, mat1[ECX] ; eax is 0 …Run Code Online (Sandbox Code Playgroud) 如何使用 asm() 将 32 位值写入寄存器 r8-r15 的低位双字?以下代码无法编译:
#include <stdlib.h>
#include <stdio.h>
int main()
{
float f0,f1,f2=-2.4f;
asm volatile
(
"movl %2, %%r8\n"
"movl %%r8, %1\n"
"movl %1, %%r15\n"
"movl %%r15, %0"
:"=r"(f0,f1)
:"r"(f1,f2)
:"%r8,%r15"
);
printf("%f\n",f0);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
unknown register name '%r8,%r15' in 'asm'
Run Code Online (Sandbox Code Playgroud)
请注意,它是一个 x64 程序,因此 r8-r15 寄存器应该可用。
这个想法是,我想收集的返回的值double成一个矢量寄存器,用于机加工imm width在一个时间而不第一存储回到存储器。
特定的处理vfma与其他两个操作数都是constexpr,因此它们可以简单地由_mm256_setr_pd调用或从 中对齐/未对齐的内存加载constexpr array。
有没有办法%ymm直接从 value in 中将double 存储在特定位置以%rax进行收集?
目标机器是 Kaby Lake。更有效的未来向量指令也是受欢迎的。
这是我的代码。
long doSystemCall(const char *path) {
register long x0 asm("x0") = 0;
register long x1 asm("x1") = (long) path;
register long x2 asm("x2") = 0;
register long x3 asm("x3") = 0;
register long x8 asm("x8") = __NR_faccessat;
__asm__ volatile("svc #0"
:"=r"(x0)
:"0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x8)
:"memory"
);
__android_log_print(ANDROID_LOG_INFO, "SYSCALL", "Result: %li", x0);
return x0;
}
Run Code Online (Sandbox Code Playgroud)
它给出的返回值是0, -2or -13,但是faccessat应该只返回0or -1。我怎样才能解决这个问题?
我的代码的反编译伪代码如下所示。
signed __int64 __fastcall sub_E558(const char *a1)
{
signed __int64 v1; …Run Code Online (Sandbox Code Playgroud) inline-assembly ×10
assembly ×5
c ×5
gcc ×5
c++ ×3
x86 ×2
x86-64 ×2
arm ×1
arm64 ×1
avx ×1
intrinsics ×1
objective-c ×1
visual-c++ ×1
xcode ×1