使用内联汇编编译和链接源文件时,我发现链接错误。
以下是测试文件:
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) x86-64汇编中操作数的顺序是什么?:指令目标,源或:指令源,目标
我有三本书和两种不同的方法!
我正在尝试将我的简单程序从英特尔语法转换为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'msg db"Hello,World!",0Ah'的操作数大小不匹配
hello.S:19: Error: no such instruction:
我需要做什么?
我在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个字节吗?提前致谢!
我有一条用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)以获得预期的行为?
在查看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)
如何确定值是从左向右处理还是从右处理?
我正在阅读有关位置独立代码的文章,并且遇到了此函数的汇编清单。
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) 我正在尝试将 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) 我正在使用 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 …
我的perf报告显示了 AT&T 语法中的所有内容:
...\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...\nRun Code Online (Sandbox Code Playgroud)\n但对我来说读这个很难,我更熟悉英特尔语法。
\n有没有办法让 perf 以 Intel 语法输出它?我尝试在谷歌上搜索手册,但没有找到任何标志来启用此模式
\n我有以下代码.
#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到屏幕?
intel-syntax ×11
assembly ×8
x86 ×4
att ×3
c++ ×2
gcc ×2
x86-64 ×2
disassembly ×1
nasm ×1
objdump ×1
optimization ×1
perf ×1
visual-c++ ×1
x86-16 ×1