Articles of x86

glibc没有正确编译

在编译glibc 2.11 ,出现以下错误。 任何想法如何解决这个问题。 In file included from ../sysdeps/unix/sysv/linux/syslog.c:10: ../misc/syslog.c: In function '__vsyslog_chk': ../misc/syslog.c:123: sorry, unimplemented: inlining failed in call to 'syslog': function body not available ../misc/syslog.c:155: sorry, unimplemented: called from here make[2]: *** [/home/alice/Desktop/glib-build/misc/syslog.o] Error 1 make[2]: Leaving directory `/home/alice/Desktop/glibc-2.11/misc' make[1]: *** [misc/subdir_lib] Error 2 make[1]: Leaving directory `/home/alice/Desktop/glibc-2.11' make: *** [all] Error 2

Linux 32位反汇编调用指令到下一个字节

我正在为32位和64位Linux操作系统创build驱动程序。 其中一个要求就是所有的代码都需要自己包含,而且没有任何呼叫。 在64位我没有问题,但在32位GCC似乎添加到下一个字节的调用指令。 search了一下后,我发现这个链接: http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html 有没有办法在32位Linux上禁用这个function? 例如:32位拆卸: <testfunc>: 0: push %ebp 1: mov %esp, %ebp 3: call 4 <test_func+0x4> <…some operation on ebx as mentioned in the link above> 64位disassebmly: <testfunc>: 0: push %rbp 1: mov %rsp, %rbp 3: <…no call here> “testfunc”中根本没有调用。 即使那么为什么32位编译器添加这些“调用”指令? 任何帮助表示赞赏。

为什么这个代码以相反的顺序输出?

为什么第一个代码打印DCBA和第二个ABCD? 是0x44434241不等于DCBA? mov eax,4 push dword "DCBA" mov ebx,1 mov ecx,esp mov edx,4 int 0x80 add esp,4 mov eax,4 push dword 0x44434241 mov ebx,1 mov ecx,esp mov edx,4 int 0x80 add esp,4

gcc编译.c与.s文件 – .bss混淆(bug?)

在IA32体系结构的Ubuntu 12.04下使用gcc 4.6.3时遇到了一个问题,那就是使用存储在.bss段上的汇编文件编译C文件,同时使用.comm和.lcomm指令。 在.comm和.lcomm缓冲区之间,汇编文件foo.s使用接近最大的空间让我在这个分区中分配(foo计算长整数的总分解)。 用一个汇编文件bar.s来处理I / O等等,所有东西都编译和链接正常(和快速),并且工作正常。 当我使用C文件bar.c处理I / O时,gcc不会终止 – 至less不会在5分钟内完成。 .bss请求接近我的小型笔记本内存,但由于.bss段没有得到编译时初始化,并与bar.s一起工作,我不明白为什么会发生这种情况。 当我减小在foo.s中请求的.bss大小时,gcc编译并链接正常,并且所有的东西都按照它应该执行的那样执行。 此外,正如所料,在每种情况下使用创build的可执行文件的文件大小 gcc bar.c foo.s -Wall 不依赖于.bss请求的大小 (我编译的大小都比原来的小,大小不一)。 在所有情况下,可执行文件都是非常小的(可能是10k),实际上它的大小是相同的,但显然,原始文件不能成功编译并挂起。 这是海湾合作委员会的错误? 有没有一个命令行选项来防止这种情况发生? 或者是怎么回事? 编辑:每个评论,这里是与.bss段分配的部分: # Sieve of Eratosthenes # Create list of prime numbers smaller than n # # Note: – no input error (range) check # – n <= 500,000,000 (could be […]

当我们将一块硬件插入计算机系统时会发生什么?

当我们将一块硬件插入计算机系统时,比方说一个网卡(网卡)或一个声卡,机箱底下会发生什么事情,以便我们使用那块硬件? 我可以想到以下两种情况,纠正我,如果我错了。 如果硬件有自己的内存芯片, 有人会安排一系列地址空间来映射这些内存芯片。 如果硬件没有自己的存储芯片, 有人会在计算机系统的主存储器中分配一定范围的地址来容纳该硬件。 我不确定前面提到的人是操作系统还是CPU。 还有一个问题:硬件总是需要一些内存来工作吗? 我对吗? 非常感谢。

Memcpy与memset相同

我想用memcpy来测量内存带宽。 我从这个答案修改了代码: 为什么vector化循环没有使用memset来衡量带宽的性能改进 。 问题是memcpy只比memset稍慢,因为我认为memcpy运行速度是内存两倍以上的两倍。 更具体地说,我运行了超过1 GB的数组a和b (分配将calloc )100次,执行以下操作。 operation time(s) —————————– memset(a,0xff,LEN) 3.7 memcpy(a,b,LEN) 3.9 a[j] += b[j] 9.4 memcpy(a,b,LEN) 3.8 请注意, memcpy只比memset慢一点。 a[j] += b[j] (其中j越过[0,LEN) )的操作应该比memcpy长三倍,因为它操作的数据量是三倍。 但是它只有memset 2.5左右。 然后我用memset(b,0,LEN)将b初始化为零并再次testing: operation time(s) —————————– memcpy(a,b,LEN) 8.2 a[j] += b[j] 11.5 现在我们看到, memcpy大约是memset两倍, a[j] += b[j]大约是memset三倍。 至less我会预期,在memset(b,0,LEN) , memcpy会比较慢,因为 100次迭代中的第一次迭代的延迟分配(第一次触发) 。 为什么我只能在memset(b,0,LEN)之后得到预期的时间? test.c的 #include <time.h> […]

C调用约定并传递参数

在Linux(或OS X)中进行函数调用时,被调用者是否可以修改堆栈中参数的值? 我是在这样的假设下,因为调用者是清理它们的那个,所以在函数调用之后它们应该包含相同的值。 但是我发现使用-O2的GCC正在修改传递给堆栈的参数。 我还查找了包括System V i386调用约定的文档,但无法find明确的答案。 这是我正在debugging的一些示例代码。 pushl %eax # %eax = 0x28 call _print_any popl %eax # %eax is now 0x0a 我会假设GCC修改堆栈上的参数是好的,但我想知道它在哪里指定它可以这样做。

在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 […]

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

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