Articles of x86 64

查找哪个汇编指令在未经debugging的情况下导致非法指令错误

在运行程序集时,我得到Illegal instruction错误。 有没有办法知道哪个指令导致错误,没有debugging,因为我正在运行的机器没有debugging器或任何开发系统。 换句话说,我在一台机器上编译并运行另一台机器。 我不能在我正在编译的机器上testing我的程序,因为它们不支持SSE4.2。 我正在运行程序的机器确实支持SSE4.2指令。 我认为这可能是因为我需要告诉汇编程序(YASM)识别SSE4.2指令,就像我们通过将-msse4.2标志传递给gcc一样。 或者你认为它不是原因? 任何想法如何告诉YASM识别SSE4.2指令? 也许我应该捕获SIGILL信号,然后解码SA_SIGINFO,看看程序做了什么样的非法操作。

在x86(32位)Linux上启动x86_64代码,在x86_64 CPU上运行

?是否可以在i686 Linux(x86,32位)上启动x86_64代码? 我的CPU是现代Core 2,它本身可以运行x86_64 64位代码,但操作系统是32位。 开始的代码是纯math的,它几乎不需要与操作系统交互。 我想测量,与32位模式相比,我的程序在64位模式下速度有多快。 该scheme是解决巨大的组合问题,全尺寸运行几十个小时。 我可以用qemu启动64位代码,但是它不会在本机执行,而且在qemu中的速度与真实的cpu速度无关。

(x86_64 linux程序集)为什么使用float格式string的printf只能与rsp%0x10 = 0一起工作

我在x86_64 linux汇编程序上写了一个printf调用的问题。 如果我尝试在rsp % 0x10 != 0时打印一个double值,那么printf将会出现段错误。 看看我的代码(nasm语法): [bits 64] global _start extern printf extern pow section .data printf_format db '%lf', 10, 0 section .text _start: mov rbp, rsp sub rsp, MEM_VAL mov rax, 0x4000000000000000 mov qword [rsp], rax movsd xmm0, qword [rsp] mov rdi, printf_format mov rax, 1 call printf mov rax, 60 mov […]

GCC:putchar(char)inline assembly

溢出, 我怎么才能实现使用内联汇编的putchar(char)过程? 我想在x86-64程序集中做到这一点。 我这样做的原因是实现我自己的标准库(或至less它的一部分)。 这是我到目前为止: void putchar(char c) { /* your code here: print character c on stdout */ asm(…); } void _start() { /* exit system call */ asm("mov $1,%rax;" "xor %rbx,%rbx;" "int $0x80" ); } 我正在编译: gcc -nostdlib -o putchar putchar.c 感谢您的帮助!

在Linux中轻松检查英特尔汇编操作码

我一直在寻找一种实用的工具,可以在Linux中打印任何英特尔64位或32位指令的操作码,例如。 像DOS中的Hiew's汇编程序。 基于networking的服务也是一个select。 因为我找不到任何东西,所以我创build了自己的bash脚本,它从命令行参数(指令[s]和<32/64>)创build汇编源文件,编译,链接和反汇编,并显示正确拆卸行。 但是,是否已经有一些程序能够显示任何给定指令的所有可能的编码,例如。 对于mov eax,ebx ? 我使用nasm , ld和ndisasm显然只给每个指令一个可能的编码。 通过这个脚本,我可以得到nasm用于64位和32位代码的编码,例如: /home/user/code/asm$ showop 'nop;add eax,ebx;cpuid' 64 00000000 90 nop 00000001 01D8 add eax,ebx 00000003 0FA2 cpuid 但是,我怎样才能轻松获得所有可能的操作码编码? 有没有可用的程序? 代码如下: #!/bin/bash # usage: showop instructions bits asminstr=$1 bits=$2 # asminstr="nop;nop;nop;nop;add eax,ebx;nop;nop;nop" # bits=64 numberofinstr=`echo $asminstr | grep -o ";" | wc -l` ((numberofinstr++)) if [ […]

是否有可能中断一个进程和检查点,以便稍后恢复?

比方说,你有一个应用程序,它正在消耗所有的计算能力。 现在你想做一些其他必要的工作。 Linux上有什么办法可以中断那个应用程序和检查点的状态,以便稍后可以从它被中断的状态恢复。 特别是我感兴趣的方式,应用程序可以停止并在另一台机器上重新启动。 这可能吗?

为什么这个内联程序集不工作?

对于下面的代码: long buf[64]; register long rrax asm ("rax"); register long rrbx asm ("rbx"); register long rrsi asm ("rsi"); rrax = 0x34; rrbx = 0x39; __asm__ __volatile__ ("movq $buf,%rsi"); __asm__ __volatile__ ("movq %rax, 0(%rsi);"); __asm__ __volatile__ ("movq %rbx, 8(%rsi);"); printf( "buf[0] = %lx, buf[1] = %lx!\n", buf[0], buf[1] ); 我得到以下输出: buf[0] = 0, buf[1] = 346161cbc0! […]

为什么这个movq指令工作在linux上而不是osx?

以下汇编代码在OSX 10.9.4上运行时出现错误,但在Linux(Debian 7.6)上成功运行。 特别是,movq指令似乎不喜欢标签参数。 $ cat test.S .globl _main _main: movq $_main, %rax ret 这是错误: $ as -o test.o test.S test.S:3:32-bit absolute addressing is not supported for x86-64 test.S:3:cannot do signed 4 byte relocation 将第3行中的$_main更改$_main像$10这样的文字可以正常工作。 代码必须以非常小的方式进行修改,才能使其在Linux上运行 – 只需从标签中删除下划线即可。 $ cat test.S .globl main main: movq $main, %rax ret 独立validation代码在Linux上工作是非常容易的: $ as -o test.o test.S $ […]

如何解释x86-64上的段寄存器访问?

有了这个function: mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648> add %fs:0x0,%rax retq 我如何解释第二条指令并找出RAX中添加的内容?

系统调用x86_64 Linux中的内联asm?

为什么这打印垃圾,而不是退出我的程序优雅? 我在BSD上以这种方式使用系统调用,我想知道我需要什么来使它在Linux中工作。 int main(int argc, char **argv) { __asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */ return 0; } 谢谢。