Articles of 程序集

g ++ 4.6.1编译器错误:错误:未知的伪操作:`.cfi_personality'

我有一个文件编译没有错误或警告我的MacBook Pro运行osx(雪豹)使用g ++(4.6.1)。 我只是上传到我们的Linux集群(不是由我运行),并试图在那里编译(也使用gcc 4.6.1)。 这次我和汇编器有很多奇怪的错误信息。 我如何解释以下错误? g++ -I../shared/boost_1_47_0 -std=c++0x -O2 -c ../shared/ft.cpp -o ../shared/ft.o /tmp/ccEqihNa.s: Assembler messages: /tmp/ccEqihNa.s:809: Error: unknown pseudo-op: `.cfi_personality' /tmp/ccEqihNa.s:810: Error: unknown pseudo-op: `.cfi_lsda' /tmp/ccEqihNa.s:1055: Error: unknown pseudo-op: `.cfi_personality' /tmp/ccEqihNa.s:1056: Error: unknown pseudo-op: `.cfi_lsda' :145: Error: unknown pseudo-op: `.cfi_personality' :146: Error: unknown pseudo-op: `.cfi_lsda' :248: Error: unknown pseudo-op: `.cfi_personality' :249: Error: […]

在x86中将string定义为字节(db)和将string定义为字/双字(dw / dd)有什么区别?

我试图调查大会定义标签之间的差异,这里是一个例子 ALabel: db 'Testing' AAnotherLabel: dw 'Testing' 现在,让我加载到一个32位寄存器: mov eax, [ALabel] mov ebx, [AAnotherLabel] 经过gdb的调查,我发现eax和ebx的所有子寄存器都包含相同的值,请看这里: info register eax 0x64636261 //dcba info register ebx 0x64636261 //dcba 他们是一样的! 在Jeff Duntemann的书中(汇编语言使用Linux进行分步编程),他给出了一个单词和双字进入寄存器的例子,但由于某种原因加载了偏移量(即像这样的值的地址) DoubleString: dd 'Stop' mov edx, DoubleString 对edx内容的调查显示,它包含一个地址,可能是string中前四个字母的地址,与第一个地址相同,尽pipe我在这里进行了推测。 我想澄清在这里真正发生了什么,并且这个声明实际上是将string中第一个字母的地址加载到一个寄存器中: Fin: db 'Final' mov ecx, Fin

汇编语言中的分割错误

我正在学习AT&T x86汇编语言。 我试图编写一个汇编程序,它采用整数n,然后返回结果(n / 2 + n / 3 + n / 4)。 这是我所做的: .text .global _start _start: pushl $24 call profit movl %eax, %ebx movl $1, %eax int $0x80 profit: popl %ebx popl %eax mov $0, %esi movl $4, %ebp div %ebp addl %eax, %esi movl %ecx, %eax movl $3, %ebp div %ebp addl […]

X86 64位汇编Linux'Hello World'连接问题

我试图跟进这个线程 ,不幸的是不能解决我的问题。 我试图运行的代码如下所示: ; File hello.asm section .data msg: db "Hello World!",0x0a,0 section .text global main extern printf main: push rbp mov rbp, rsp lea rdi, [msg] ; parameter 1 for printf xor eax, eax ; 0 floating point parameter call printf xor eax, eax ; returns 0 pop rbp ret 我的系统是debian stretch: $ uname […]

Linux上的_emit相当于什么?

我试图将在Visual Studio中编写的汇编代码移植到Linux上的GNU内联汇编中。 原始代码使用MSDN描述的_emit作为伪指令,并解释为: _emit伪指令类似于MASM的DB指令。 您可以使用_emit在当前文本段中的当前位置定义一个即时字节。 但是,_emit一次只能定义一个字节,只能在文本段中定义字节。 它使用与INT指令相同的语法。 我怎样才能在Linux上做同样的事情?

如何在linux中打败core i3 / i7中的硬件预取器

我试图find一种方法来击败H / W预取器来检测stream模式,并以随机顺序访问4KB数据,以使其不被H / W预取器检测和预取。 最初,我打算以随机模式访问所有偶数索引数据,因为H / W预取器总是预取下一个caching行(所以当我访问偶数索引时,下一个奇数索引数据已经被预取)。 我编写了代码以随机模式访问所有偶数索引数据,但是结果表明预取器检测到模式(不知道怎么做?没有固定的跨度,都是随机跨度) 我正在调查原因 – 为什么发生这种情况,然后我在英特尔find了这篇文章; https://software.intel.com/en-us/forums/topic/473493 根据John D. McCalpin博士的博士“Bandwidth博士, 在“Intel 64和IA-32架构优化参考手册”(文档248966-028,2013年7月)的第2.2.5.4节中,它指出, stream媒体预取器“[d]检测和维护多达32个数据访问stream,对于每个4K字节的页面,可以保持一个前向和一个后向stream。 这意味着L2硬件预取器跟踪最近访问的16个4KiB页面,并记住足够的这些页面的访问模式以跟踪一个前向stream和一个后向stream。 因此,要使用“随机”提取来击败L2stream转预取器,只需确保您访问超过15个其他4个KiB页面,然后再对先前引用的页面进行第二次引用。 所以一个“随机”取序列可能由16个以上的4个KiB页码随机排列组成,每个页面内有一个随机偏移量。 (我通常在我的排列列表中使用至less32页。) 所以它意味着在访问相同的4KB页面的两个不同的随机索引之间,我们需要访问至less16个4KB页面来击败H / W预取器。 我已经实现了John D. McCalpin所提出的概念,然而结果再一次显示了h / w预取器没有被击败。 它能够检测某些模式和预取数据(请参阅示例输出)。 我从20-40页的4KB页面访问页数不一样,但结果没有改进/改变。 这是我的代码: #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sched.h> #ifndef _POSIX_THREAD_PROCESS_SHARED #error This system does not […]

从C传递参数到64位Linux大会

我试图写我的第一个汇编函数从C程序中调用。 这是.c部分: #include <stdio.h> extern int sum(int a, int b); int main() { printf("2+3 = %d\n", sum(2,3)); return 0; } 和汇编部分: .text .global sum sum: push %rbp mov %rsp, %rbp mov 8(%rbp), %rax add 12(%rbp), %rax pop %rbp ret 根据一些教程,参数应该存储在%ebp(32位版本)寄存器中。 但是,当我编译上面的代码,我得到这个结果: 2+3 = 4195607 有人能解释我在做什么错吗? 哦,这里是Makefile: test: test.o testc.o gcc -o test test.o testc.o test.o: […]

有没有错误列表会显示为“segfaults”,当他们没有真正的内存访问?

在这个问题中 ,我了解到,如果不在响铃0时尝试运行特权指令,可能会导致在用户进程中看起来像段错误,并有两个后续问题。 所有特权指令都是如此吗? 还有什么其他types的错误会导致假段错误,但与试图读取内存无关?

Linux x86:实模式地址空间在受保护的内核模式下映射到哪里?

在x86平台上运行的Linux中,实模式地址空间是在受保护的内核模式下映射到的吗? 在内核模式下,一个线程可以直接访问内核地址空间。 内核处于低8MB,页表处于某个位置等(如此处所述)。 但是实模式地址空间在哪里呢? 可以直接访问吗? 例如BIOS和BIOS插件(见这里 )?

复制和调用function

我想复制并调用一个函数,但调用缓冲区时,下面的代码段错误。 我需要改变什么? (Linux,x86) #include <string.h> #include <malloc.h> #include <stdio.h> int foo () { return 12; } void foo_end () {} int main () { int s = (unsigned long long) foo_end – (unsigned long long) foo; int (*f) () = (int (*)()) malloc (s); memcpy ((void*) f, (const void*) foo, s); printf ("%d %d\n", f […]