标签: intel-syntax

在 .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
查看次数

中断GAS

我正在尝试将我的简单程序从英特尔语法转换为AT&T(用GAS编译).我已经成功转换了我的应用程序的一大部分,但我仍然得到int(中断)的错误.我的功能是这样的:

printf:
    mov $0x0e, %ah
    mov $0x07, %bl

    nextchar:
       lodsb
       or %al, %al
       jz return
       int 10
       jmp nextchar

    return:
       ret

msg db "Welcome To Track!", 0Ah
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,我得到了这个:

hello.S:汇编程序消息:
hello.S:13:错误:int'
hello.S:19: Error: no such instruction:
msg db"Hello,World!",0Ah'的操作数大小不匹配

我需要做什么?

assembly gnu-assembler intel-syntax

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

NASM预取

我在NASM文档中遇到了以下说明,但我无法完全了解它们.可悲的是,英特尔关于这些说明的文档也有些缺乏.

PREFETCHNTA m8                ; 0F 18 /0        [KATMAI] 
PREFETCHT0 m8                 ; 0F 18 /1        [KATMAI] 
PREFETCHT1 m8                 ; 0F 18 /2        [KATMAI] 
PREFETCHT2 m8                 ; 0F 18 /3        [KATMAI]
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供一个简明的指令示例,比如在给定地址缓存256个字节吗?提前致谢!

optimization assembly nasm intel-syntax

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

在GNU中以.intel_syntax区分内存与常量

我有一条用Intel语法编写的指令(使用gas作为汇编程序),看起来像这样:

mov rdx, msg_size
...
msg: .ascii "Hello, world!\n"
     .set msg_size, . - msg
Run Code Online (Sandbox Code Playgroud)

但是该mov指令正在汇编到mov 0xe,%rdx,而不是mov $0xe,%rdx我期望的那样。我应该如何编写第一条指令(或的定义msg_size)以获得预期的行为?

assembly gnu-assembler intel-syntax

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

如何确定寄存器是从右到左加载,反之亦然

在查看gdb输出并查看汇编调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右到左加载,反之亦然.

通常类似于以下内容:

  sub     rsp, 16
Run Code Online (Sandbox Code Playgroud)

要么

  sub     16, rsp 
Run Code Online (Sandbox Code Playgroud)

但有时候,没有像上面这样的值可见.我所看到的只是如下调用:

(gdb) disassemble
 Dump of assembler code for function main:
 0x0000000100000f54 <main+4>:    mov    $rdi,%r15
 0x0000000100000f59 <main+9>:    mov    $rsi,%r14
 0x0000000100000f60 <main+16>:   mov    $rdx,%r13
 0x0000000100000f67 <main+23>:   mov    $ecx,$r12d
 End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

如何确定值是从左向右处理还是从右处理?

x86 assembly cpu-registers att intel-syntax

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

为什么objdump的汇编编码不同?

我正在阅读有关位置独立代码的文章,并且遇到了此函数的汇编清单。

0000043c <ml_func>:
 43c:   55                      push   ebp
 43d:   89 e5                   mov    ebp,esp
 43f:   e8 16 00 00 00          call   45a <__i686.get_pc_thunk.cx>
 444:   81 c1 b0 1b 00 00       add    ecx,0x1bb0
 44a:   8b 81 f0 ff ff ff       mov    eax,DWORD PTR [ecx-0x10]
 450:   8b 00                   mov    eax,DWORD PTR [eax]
 452:   03 45 08                add    eax,DWORD PTR [ebp+0x8]
 455:   03 45 0c                add    eax,DWORD PTR [ebp+0xc]
 458:   5d                      pop    ebp
 459:   c3                      ret

0000045a <__i686.get_pc_thunk.cx>:
 45a:   8b 0c 24                mov …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc objdump intel-syntax

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

来自 AT&amp;T 语法的 Intel Assembly ljmp 语法

我正在尝试将 xv6 引导代码从 At&t 语法转换为 Intel 语法,但我在使用 ljmp 指令时遇到了问题。我正在尝试学习 Intel 计算机的启动过程,并且我对 Intel 程序集不是特别擅长。

原始的 AT&T 语法是ljmp $0x8, $start32.

最小的例子:

.code16
   jmp 0x8:start32          # won't assemble

.code32
start32:
   nop
Run Code Online (Sandbox Code Playgroud)

使用as -32 -msyntax=intel -mnaked-reg foo.s和GNU Binutils的2.35.1产生
Error: junk ':start32' after expression的远JMP线。

我使用 GNU as 和 gcc 工具。
程序集也可能存在其他问题,例如 gdtdesc 和 gdt。

移植到英特尔语法的完整代码是:

# Start the first CPU: switch to 32-bit protectied mode, jump into C.
# The BIOS loads this code from the first sector of the …
Run Code Online (Sandbox Code Playgroud)

assembly gnu-assembler att intel-syntax x86-16

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

AT&amp;T 语法 hello world 有效,但 intel 语法无效

我正在使用 GAS 汇编器为 linux x86_64 编写一个 hello world 程序,这是我的 AT&T 语法代码。

#.intel_syntax noprefix

.section .data
    msg:
        .ascii "hello world\n"
.section .text
.globl _start
_start:
    movq  $1, %rax
    movq  $1, %rdi
    movq  $msg, %rsi
    movq  $12, %rdx
    syscall

    movq  $60, %rax
    movq  $0, %rdi
    syscall
Run Code Online (Sandbox Code Playgroud)

这有效并打印“hello world”。这是英特尔语法:

.intel_syntax noprefix

.section .data
    msg:
        .ascii "hello world\n"
.section .text
.globl _start
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 12
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
Run Code Online (Sandbox Code Playgroud)

这编译并运行良好,但不打印“hello …

assembly x86-64 gnu-assembler intel-syntax

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

选择性能报告汇编的 Intel 语法

我的perf报告显示了 AT&T 语法中的所有内容:

\n
...\n0,18 \xe2\x94\x82      pop         %rax                      \n0,14 \xe2\x94\x82    \xe2\x86\x90 retq                                  \n0,18 \xe2\x94\x82a9:   vmovsd      -0x8(%rdi,%rsi,8),%xmm0   \n0,12 \xe2\x94\x82af:   pop         %rax                      \n     \xe2\x94\x82    \xe2\x86\x90 retq                                  \n     \xe2\x94\x82b1:   vxorpd      %xmm2,%xmm2,%xmm2       \n0,02 \xe2\x94\x82      vxorpd      %xmm3,%xmm3,%xmm3       \n     \xe2\x94\x82b9:   vmovsd      0x8(%rdi,%rax,8),%xmm4  \n0,82 \xe2\x94\x82      vmulsd      %xmm1,%xmm1,%xmm1       \n0,16 \xe2\x94\x82      vsubsd      %xmm3,%xmm1,%xmm1       \n0,96 \xe2\x94\x82      vsubsd      %xmm2,%xmm4,%xmm3       \n0,57 \xe2\x94\x82      vmulsd      %xmm3,%xmm0,%xmm0       \n5,34 \xe2\x94\x82      vdivsd      %xmm1,%xmm0,%xmm0       \n0,55 \xe2\x94\x82      vaddsd      %xmm0,%xmm2,%xmm0      \n...\n
Run Code Online (Sandbox Code Playgroud)\n

但对我来说读这个很难,我更熟悉英特尔语法。

\n

有没有办法让 perf 以 Intel 语法输出它?我尝试在谷歌上搜索手册,但没有找到任何标志来启用此模式

\n

x86 disassembly intel-syntax perf

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

C++中的汇编程序

我有以下代码.

#include<iostream>
using namespace std;
int main() {
    int result=0;
    _asm {
         mov eax,2
         mov eax,result;
    }

    cout<<result<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道汇编程序很好,但为什么程序输出2到屏幕?

c++ x86 inline-assembly visual-c++ intel-syntax

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