我需要一些帮助,找到并使用一个好的调试器,用于在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链接.
加载x64 ymm寄存器的最有效方法是什么?
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)在任何位置都有4次加倍
i.e. i want to load for example 1, 6, 22, 43
Run Code Online (Sandbox Code Playgroud)以下是做什么的?
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) 我最近开始研究汇编代码,我正在尝试重新编码一些基本的系统函数来掌握它,我目前仍然在我的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) 我目前正在编写编译器,即将实现代码生成.目前的目标指令集是x64.
现在x64是CISC,因此有许多复杂的指令.但我知道这些内部由CPU内部转换为RISC,之后也会出现无序执行.
因此,我的问题是:使用更短的指令(类似RISC)是否会比使用更少的复杂指令产生性能影响?我语言的测试程序并不是那么大,所以我认为在缓存中使用指令应该不是问题.
问题: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) 据我了解,浮点存储在XMM寄存器中,而不是诸如的通用寄存器中eax,因此我做了一个实验:
float a = 5;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,a被存储1084227584在XMM寄存器中。这是程序集版本:
.text
.global _start
.LCO:
.long 1084227584
_start:
mov .LCO, %eax
movss .LCO, %xmm0
Run Code Online (Sandbox Code Playgroud)
执行上述组件和使用它的调试gdb显示,在值eax将是1084227584,然而,在值ymm0是5。
这是我的问题:
1- XMM寄存器有什么特别之处?除了SIMD指令,它们是唯一存储浮点的寄存器类型吗?
为什么不能在常规寄存器中设置相同的位?
2- float和double值始终存储为浮点吗?
我们永远不能将它们存储为fixed pointC或汇编语言吗?
可以通过硬件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)
“某些特殊情况”是指异常的红利和除数。我只想比较 …
我的应用程序受益于gcc与gcc一起运行时可以访问的高级CPU功能-march native。Docker可以消除OS中的差异,但是如何处理不同的CPU?要构建可以在任何CPU上运行的应用程序,我必须为amd64构建,但会损失很多性能。当需要针对每种CPU架构分别编译应用程序时,是否有一种分发Docker映像的好方法?
我有一个非常简单的代码:
#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)