相关疑难解决方法(0)

如何使用gcc以英特尔语法生成汇编代码?

gcc -S选项将以AT&T语法生成汇编代码,有没有办法用Intel语法生成文件?或者有没有办法在两者之间进行转换?

x86 assembly gcc gnu intel

144
推荐指数
3
解决办法
7万
查看次数

什么是处理或记住GNU汇编程序中cmp的后向参数的好方法?

以下是Intel语法中的一些汇编代码:

// Jump to done if rsi >= rax.
cmp rsi, rax
jae done
Run Code Online (Sandbox Code Playgroud)

这对我的大脑有意义:如果rsi"高于或等于"rax,则跳转,匹配指令中参数的顺序cmp.将其与GNU语法进行比较:

// Jump to done if rsi >= rax.
cmp %rax, %rsi
jae done
Run Code Online (Sandbox Code Playgroud)

这每次伤害我的大脑.它没有帮助,当我来到这个新的后一段时间不写汇编代码我去看看的语义cmp ,并jae在Intel手册,发现这一切都在"第一","第二"操作,来表述其与我面前在屏幕上看到的不符.

结束抱怨.我的问题:

  1. 有没有其他方式表达cmpjaeGNU汇编程序,以便操作数的顺序cmp与逻辑比较匹配jae

  2. 假设(1)的答案是否定的,是否有人有一个很好的方式让我看看这个,以便我能记住下次它是如何工作的?还有比"GNU倒退"更好的东西吗?

请注意,我不是要问如何在GNU汇编程序中使用Intel语法; 我知道这是可能的.我正在使用现有的GNU语法代码库,并且正在寻求一些助记符或其他方式来帮助我保持这一点.

x86 assembly gnu gnu-assembler

7
推荐指数
1
解决办法
294
查看次数

如何设置 gcc 以永久使用 intel 语法?

我有以下代码,可以用 gcc 命令很好地编译gcc ./example.c。程序本身调用函数“add_two”,它只是将两个整数相加。要在扩展汇编指令中使用 intel 语法,我需要首先切换到 intel,然后再切换回 AT&T。根据 gcc 文档,可以使用gcc -masm=intel ./exmaple.

每当我尝试使用 switch 编译它时,-masm=intel它都不会编译,我不明白为什么?我已经尝试删除该指令,.intel_syntax但它仍然无法编译。

#include <stdio.h>

int add_two(int, int);

int main(){
     int src = 3;
     int dst = 5;
     printf("summe = %d \n", add_two(src, dst));
     return 0;
}

int add_two(int src, int dst){

    int sum;

    asm (
        ".intel_syntax;"  //switch to intel syntax
        "mov %0, %1;"
        "add %0, %2;"

        ".att_syntax;"  //switch to at&t syntax
        : "=r" (sum) //output
        : "r" (src), "r" …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc inline-assembly intel-syntax

5
推荐指数
1
解决办法
4480
查看次数

如何在Linux中以C语言获取当前进程的处理器ID?

我正在编写一个程序,需要知道它运行的逻辑处理器.

这个问题告诉我如何在汇编中执行此操作,而这个问题告诉我如何在汇编中使用此代码而不将其转换为AT&T语法.

使用现有的Linux系统调用或库函数有没有更简单的方法来实现这一点,还是我需要重新发明轮子?

c linux

4
推荐指数
2
解决办法
8767
查看次数

memcpy在linux中移动128位

我正在linux中为PCIe设备编写设备驱动程序.此设备驱动程序执行多次读写操作以测试吞吐量.当我使用memcpy时,TLP的最大有效载荷是8个字节(在64位架构上).在我看来,获得16字节有效载荷的唯一方法是使用SSE指令集.我已经看到了这个,但代码没有编译(AT&T/Intel语法问题).

  • 有一种方法可以在linux中使用该代码吗?
  • 有谁知道我在哪里可以找到一个移动128位的memcpy的实现?

c linux assembly sse simd

3
推荐指数
2
解决办法
2001
查看次数

在 .intel_syntax GNU C 内联汇编中引用内存操作数

使用内联汇编编译和链接源文件时,我发现链接错误。

以下是测试文件:

via:$ cat test.cxx
extern int libtest();
int main(int argc, char* argv[])
{
    return libtest();
}

$ cat lib.cxx
#include <stdint.h>
int libtest()
{
    uint32_t rnds_00_15;    
    __asm__ __volatile__
    (
        ".intel_syntax noprefix         ;\n\t"
        "mov DWORD PTR [rnds_00_15], 1  ;\n\t"
        "cmp DWORD PTR [rnds_00_15], 1  ;\n\t"
        "je  done                       ;\n\t"
        "done:                          ;\n\t"
        ".att_syntax noprefix           ;\n\t"
        :
        : [rnds_00_15] "m" (rnds_00_15)
        : "memory", "cc"
    );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译和链接程序会导致:

via:$ g++ -fPIC test.cxx lib.cxx -c
via:$ g++ -fPIC lib.o test.o -o test.exe
lib.o: …
Run Code Online (Sandbox Code Playgroud)

c++ gcc linker-errors inline-assembly intel-syntax

3
推荐指数
1
解决办法
1209
查看次数

x86-64 操作数的汇编顺序

x86-64汇编中操作数的顺序是什么?:指令目标,源或:指令源,目标

我有三本书和两种不同的方法!

assembly x86-64 att intel-syntax

3
推荐指数
1
解决办法
1207
查看次数

使用GCC的Nasm内联汇编

在我的项目中,我需要使用内联汇编,但它需要是Nasm,因为我对GAS并不太熟悉.
我的尝试:

void DateAndTime()
{
   asm
   (.l1:    mov al,10           ;Get RTC register A
    out RTCaddress,al
    in al,RTCdata
    test al,0x80            ;Is update in progress?
    jne .l1             ; yes, wait

    mov al,0            ;Get seconds (00 to 59)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeSecond],al

    mov al,0x02         ;Get minutes (00 to 59)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeMinute],al

    mov al,0x04         ;Get hours (see notes)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeHour],al

    mov al,0x07         ;Get day of month (01 to 31)
    out RTCaddress,al
    in al,RTCdata
    mov …
Run Code Online (Sandbox Code Playgroud)

c gcc inline nasm inline-assembly

2
推荐指数
1
解决办法
4278
查看次数

x86装配GAS部门

我不太确定分区在x86汇编中是如何工作的(GAS AT&T语法).我想做的是划分两个长,然后将商乘以除数,看看新数是否等于初始数(n/m*m = n).

movl %ebx, %eax
movl %ecx, %edx
idivl %edx
imull %ebx, %edx

cmp %edx, %ebx
je .equal
Run Code Online (Sandbox Code Playgroud)

上面的代码是我做分工的片段.ebx和ecx是我想要分割的两个计数器,eax寄存器用作除数是否正确?所以,当我写idivl%edx时,我将edx与eax分开,并得到最接近0的整数?像7/2 = 3?我读了一个地方,这个商存储在edx寄存器中,余数存储在ah寄存器中,但我还被告知,商存储在eax寄存器中,余数存储在edx寄存器中,这让我感到困惑.

虽然这里的主要问题是:我想将ebx寄存器的值除以ecx寄存器的值,我该如何处理?

谢谢!

编辑:上面的代码产生一个浮点异常

x86 assembly att

2
推荐指数
1
解决办法
7150
查看次数

标签 统计

assembly ×6

gcc ×4

x86 ×4

c ×3

inline-assembly ×3

intel-syntax ×3

att ×2

gnu ×2

linux ×2

c++ ×1

gnu-assembler ×1

inline ×1

intel ×1

linker-errors ×1

nasm ×1

simd ×1

sse ×1

x86-64 ×1