标签: x86-64

调试使用yasm创建的汇编代码

我需要一些帮助,找到并使用一个好的调试器,用于在64位Linux上与yasm组装的asm代码.gdb调试器一直抱怨没有加载符号表.stackoverflow上有人建议使用-dstabs开关组装,但这对我来说没有任何区别.ddd也没有什么不同.

如果我能找到摆脱"无符号表加载"问题的方法,gdb就不会那么糟糕.我还需要能够查看寄存器和其他声明的内容.

我使用yasm -f elf -m amd64 file.asm和我链接来组装我的asm文件ld file.o -o file.使用-l开关使用yasm创建.lst文件似乎也不起作用.

我发现的关于这个问题的所有建议似乎与使用gcc作为链接器而不是ld有关.我需要能够与ld链接.

x86 assembly x86-64 nasm yasm

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

使用4个单独的双倍加载x64 ymm寄存器的有效方法是什么?

加载x64 ymm寄存器的最有效方法是什么?

  1. 4个均匀间隔的双倍,即一组连续的双打

    0  1  2  3  4  5  6  7  8  9 10 .. 100
    And i want to load for example 0, 10, 20, 30
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在任何位置都有4次加倍

    i.e. i want to load for example 1, 6, 22, 43
    
    Run Code Online (Sandbox Code Playgroud)

64-bit x86 assembly x86-64 simd

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

汇编testq和cmovg指令

以下是做什么的?

testq   %rdx, %rdx
cmovg   %rcx, %rax
Run Code Online (Sandbox Code Playgroud)

我知道testq是两个寄存器之间的按位,但它如何与标志一起工作?这将在c中转化为什么?例如,如果%rdx将持有价值0x01,那么我们就会有0x01&0x01= 0x01,这将设置

ZF = 0, SF = 0, OF = 0.
Run Code Online (Sandbox Code Playgroud)

而且,如果我能找到cmovg

˜(SF ˆ OF) & ˜ZF
Run Code Online (Sandbox Code Playgroud)

哪个会解决

˜(0 ˆ 0) & ˜0 = ˜(0) & ˜0 = 1 & 1 = 1.
Run Code Online (Sandbox Code Playgroud)

这是否意味着将执行cmovg并且相应的c代码将表现为d = %rdx,a = rax并且c = rcx:

 if(d > 0){
   a = c;
 }
Run Code Online (Sandbox Code Playgroud)

或者有人可以换句话说这个吗?

另外,我一直在尝试使用这个程序集将其转换为相应的c代码.目前我得到的结果最终像testq%rdx上的无限while循环,%rdx与jne .L4.随着上面的内容被封闭.谁知道正确的解决方案是什么?我目前的解决方案是:

p:
        movq    (%rdi), %rdx
        testq   %rdx, %rdx
        je …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly x86-64 intel

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

strchr()函数实现的问题

我最近开始研究汇编代码,我正在尝试重新编码一些基本的系统函数来掌握它,我目前仍然在我的0x0上遇到了一个分段错误strchr.

section .text
global strchr

strchr:
    xor rax, rax

loop:
    cmp BYTE [rdi + rax], 0
    jz end

    cmp sil, 0
    jz end

    cmp BYTE [rdi + rax], sil
    jz good

    inc rax
    jmp loop

good:
    mov rax, [rdi + rcx]
    ret

end:
    mov rax, 0
    ret
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何使用GDB调试它,我遇到的文档非常有限或难以理解.

我在C中使用以下主要测试

extern char *strchr(const char *s, int c);

int main () {
   const char str[] = "random.string";
   const char ch = '.';
   char *ret;

   ret = strchr(str, ch);
   printf("%s\n", ret); …
Run Code Online (Sandbox Code Playgroud)

unix assembly x86-64

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

CISC短指令与长指令

我目前正在编写编译器,即将实现代码生成.目前的目标指令集是x64.
现在x64是CISC,因此有许多复杂的指令.但我知道这些内部由CPU内部转换为RISC,之后也会出现无序执行.
因此,我的问题是:使用更短的指令(类似RISC)是否会比使用更少的复杂指令产生性能影响?我语言的测试程序并不是那么大,所以我认为在缓存中使用指令应该不是问题.

performance x86-64 instruction-set

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

YASM:vmovaps指令导致分段错误

问题:movaps给我一个分段错误.

上下文:x86-64指令vmovaps设计用于Core i系列处理器(我运行此系统)上的AVX寄存器.AVX寄存器的宽度是SSE寄存器的两倍(分别为256和128位).指令vmovaps应将对齐的浮点值(32位)的向量移动到指定的ymm寄存器中.

可能的原因:源数据的对齐特别重要,因为错误对齐的数据是分段错误的来源.但是,即使我对齐了数据,我自己也遇到了分段错误.

    segment .data

align 16
xs:
    dd  0.0
    dd  1.1
    dd  2.2
    dd  3.3
    dd  4.4
    dd  5.5
    dd  6.6
    dd  7.7

align 16
ys:
    dd  8.8
    dd  7.7
    dd  6.6
    dd  5.5
    dd  4.4
    dd  3.3
    dd  2.2
    dd  1.1

    segment .text
    global main

main:
    push rbp
    mov rbp, rsp

    ; Move eight 32-bit floats from "xs" into ymm0
    vmovaps ymm0, [xs]

    ; Move …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 simd nasm avx

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

我们可以在常规寄存器中存储浮点吗?

据我了解,浮点存储在XMM寄存器中,而不是诸如的通用寄存器中eax,因此我做了一个实验:

float a = 5;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,a被存储1084227584XMM寄存器中。这是程序集版本:

.text
        .global _start
.LCO:
        .long 1084227584
_start:
        mov .LCO, %eax
        movss .LCO, %xmm0
Run Code Online (Sandbox Code Playgroud)

执行上述组件和使用它的调试gdb显示,在值eax将是1084227584,然而,在值ymm05

这是我的问题:

1- XMM寄存器有什么特别之处?除了SIMD指令,它们是唯一存储浮点的寄存器类型吗?

为什么不能在常规寄存器中设置相同的位?

2- floatdouble值始终存储为浮点吗?

我们永远不能将它们存储为fixed pointC或汇编语言吗?

c floating-point assembly x86-64

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

在某些情况下,在x86-64 Intel / AMD CPU上,128bit / 64bit硬件无符号除法能否比64bit / 32bit除法更快?

可以通过硬件128bit / 64bit除法指令执行缩放的64bit / 32bit除法,例如:

; Entry arguments: Dividend in EAX, Divisor in EBX
shl rax, 32  ;Scale up the Dividend by 2^32
xor rdx,rdx
and rbx, 0xFFFFFFFF  ;Clear any garbage that might have been in the upper half of RBX
div rbx  ; RAX = RDX:RAX / RBX
Run Code Online (Sandbox Code Playgroud)

...在某些特殊情况下,比硬件64位/ 32位除法指令执行的缩放64位/ 32位除法更快,例如:

; Entry arguments: Dividend in EAX, Divisor in EBX
mov edx,eax  ;Scale up the Dividend by 2^32
xor eax,eax
div ebx  ; EAX = EDX:EAX / EBX
Run Code Online (Sandbox Code Playgroud)

“某些特殊情况”是指异常的红利和除数。我只想比较 …

performance x86 assembly x86-64 integer-division

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

Docker和-march本机

我的应用程序受益于gcc与gcc一起运行时可以访问的高级CPU功能-march native。Docker可以消除OS中的差异,但是如何处理不同的CPU?要构建可以在任何CPU上运行的应用程序,我必须为amd64构建,但会损失很多性能。当需要针对每种CPU架构分别编译应用程序时,是否有一种分发Docker映像的好方法?

gcc x86-64 cpu-architecture avx docker

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

为什么在这个被破坏的std :: string dtor中有锁定的xadd指令?

我有一个非常简单的代码:

#include <string>
#include <iostream>

int main() {
    std::string s("abc");
    std::cout << s;
}
Run Code Online (Sandbox Code Playgroud)

然后,我编译了它:

g++ -Wall test_string.cpp -o test_string -std=c++17 -O3 -g3 -ggdb3
Run Code Online (Sandbox Code Playgroud)

然后将其反编译,最有趣的部分是:

00000000004009a0 <_ZNSs4_Rep10_M_disposeERKSaIcE.isra.10>:
  4009a0:       48 81 ff a0 11 60 00    cmp    rdi,0x6011a0
  4009a7:       75 01                   jne    4009aa <_ZNSs4_Rep10_M_disposeERKSaIcE.isra.10+0xa>
  4009a9:       c3                      ret    
  4009aa:       b8 00 00 00 00          mov    eax,0x0
  4009af:       48 85 c0                test   rax,rax
  4009b2:       74 11                   je     4009c5 <_ZNSs4_Rep10_M_disposeERKSaIcE.isra.10+0x25>
  4009b4:       83 c8 ff                or     eax,0xffffffff
  4009b7:       f0 0f c1 47 10          lock xadd …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc x86-64 atomic

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