标签: inline-assembly

为什么scanf结果与用户输入不同?

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.
这是一个功能还是黑暗是一个标准?

c++ inline-assembly

0
推荐指数
1
解决办法
235
查看次数

mrc p15 在 ARM 内联汇编中有什么作用,GNU C 内联汇编语法是如何工作的?

装配臂中的这条线有什么作用?

mrc p15, 0, %0, c9, c13, 0" : : "r" (counter)
Run Code Online (Sandbox Code Playgroud)

p15不是它应该是r15什么?

what is ::who arec9, c1每个论点的作用是什么?

assembly gcc arm inline-assembly

0
推荐指数
1
解决办法
2442
查看次数

Inline Asm的多编译器支持(x86)

对于内联asm代码,我__asm用于vc ++编译器和/ __asm__()asm()构造用于linux下的gcc.(相应的intel/at&t语法)

有没有办法以通用的方式在C中为它们声明内联汇编(x86)?

PS用于结合两者的自动化工具也是可接受的.

c x86 assembly inline-assembly

0
推荐指数
1
解决办法
252
查看次数

仅在Objective-C中使用内联汇编的ROL/ROR变量

几天前,我问了下面的问题.因为我需要快速回答,我补充说:

代码不需要使用内联汇编.但是,我还没有找到使用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)

我得到的错误是:

未知使用具有未知大小后缀的指令助记符

我怎样才能解决这个问题?

xcode objective-c inline-assembly

0
推荐指数
1
解决办法
3074
查看次数

__asm__ gcc调用内存地址

我有一个分配内存的代码,将一些缓冲区复制到该分配的内存中,然后跳转到该内存地址。

问题是我无法跳转到内存地址。我正在使用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)

但这行不通。我该怎么做?

c c++ assembly gcc inline-assembly

0
推荐指数
1
解决办法
745
查看次数

内联汇编:错误的寄存器名称

编译时我得到"错误:错误的寄存器名称'%% ecx'"

#include <stdio.h>

int main(void){
    asm("mov 3, %%ecx\n\t");
    // ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c gcc inline-assembly

0
推荐指数
1
解决办法
4614
查看次数

汇编中的乘法与负数和结果

我在组装中相当新,我很难处理负数

#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)

x86 assembly inline-assembly visual-c++

0
推荐指数
1
解决办法
2904
查看次数

通过 r15 访问 r8 的低 32 位

如何使用 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 寄存器应该可用。

c gcc x86-64 inline-assembly cpu-registers

0
推荐指数
1
解决办法
970
查看次数

如何将 %rax 中的 double 移动到 %ymm 或 %zmm 上的特定 qword 位置?(卡比湖或更高版本)

这个想法是,我想收集的返回的值double成一个矢量寄存器,用于机加工imm width在一个时间而不第一存储回到存储器。

特定的处理vfma与其他两个操作数都是constexpr,因此它们可以简单地由_mm256_setr_pd调用或从 中对齐/未对齐的内存加载constexpr array

有没有办法%ymm直接从 value in 中将double 存储在特定位置以%rax进行收集?

目标机器是 Kaby Lake。更有效的未来向量指令也是受欢迎的。

c++ x86-64 inline-assembly intrinsics avx

0
推荐指数
1
解决办法
442
查看次数

内联 ARM64 系统调用给出错误的返回值

这是我的代码。

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)

c assembly gcc inline-assembly arm64

0
推荐指数
1
解决办法
189
查看次数

标签 统计

inline-assembly ×10

assembly ×5

c ×5

gcc ×5

c++ ×3

x86 ×2

x86-64 ×2

arm ×1

arm64 ×1

avx ×1

cpu-registers ×1

intrinsics ×1

objective-c ×1

visual-c++ ×1

xcode ×1