小编Spi*_*ngo的帖子

x86-64上C中的所有函数都需要堆栈帧吗?

我已经编写了一个函数来计算C字符串的长度(我正试图击败clang的优化器-O3).我正在运行macOS.

_string_length1:
    push rbp
    mov rbp, rsp
    xor rax, rax
.body:
    cmp byte [rdi], 0
    je .exit
    inc rdi
    inc rax
    jmp .body
.exit:
    pop rbp
    ret
Run Code Online (Sandbox Code Playgroud)

这是我想要击败的C函数:

size_t string_length2(const char *str) {
  size_t ret = 0;
  while (str[ret]) {
    ret++;
  }
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

它反汇编到这个:

string_length2:
    push rbp
    mov rbp, rsp
    mov rax, -1
LBB0_1:
    cmp byte ptr [rdi + rax + 1], 0
    lea rax, [rax + 1]
    jne LBB0_1
    pop rbp
    ret
Run Code Online (Sandbox Code Playgroud)

每个C函数都使用push rbp …

c x86 assembly stack x86-64

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

不使用 libSystem macOS 链接目标文件

我正在为 x86-64 上的 macOS 编写一个编译器,但是当我将目标文件链接在一起时,ld

ld: dynamic main executables must link with libSystem.dylib for inferred architecture x86_64
Run Code Online (Sandbox Code Playgroud)

但由于 libSystem 包含 libc,我不想使用它(它会给我很多重复项)。我该如何解决这个问题?

macos linker x86-64 linker-errors ld

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

GNU 等同于时间 X db 0

我正在 GNU 中编写一个小型引导加载程序as,我需要使二进制输出“与 BIOS 兼容”。这是我如何做到的nasm

...
times 510 - ($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

但是我怎么能在 GNU 中做到呢as

gnu gnu-assembler nasm

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

SpriteKit-获取SKNode的绝对大小

我正在用Swift和编写一个小游戏SpriteKit,它是由一个盒子(4 * 8)组成的。

Scene (1024 * 768)
    boxes (964 * 452)
        row1 (932 * 25)
            col1 (24 * 116)
            col2 (24 * 116)
            col3 (24 * 116)
            ...
        row2...
Run Code Online (Sandbox Code Playgroud)

我想给他们一个纹理,但是我不知道图像文件应该有多大。盒子节点的大小似乎是相对于其父节点的。如何获得的绝对大小,SKNode节点在屏幕上的大小?

cgsize sprite-kit swift

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

斯威夫特的Double vs Float80速度

我听说x87 FPU可以使用80位浮点数,所以即使我想用64位数进行计算,它也会用80位计算它然后转换它.但是在x86-64上的Swift中最快,Double或者Float80(计算算术时)?

floating-point x86 x86-64 x87 swift

2
推荐指数
2
解决办法
1029
查看次数

从 GRUB2 多重引导信息结构中获取总可用 RAM

我设法访问了multiboot_info_ti386 内核中的 GRUB 多引导信息结构 ( ),并且有两个字段分别称为mem_lowermem_upper。我如何使用它们来获取总可用 RAM(以字节为单位)?

x86 kernel i386 grub2

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

对于 x86-64,imm64 或 m64 哪个更快?

经过大约100亿次测试,如果imm64m64AMD64快0.1纳秒,m64似乎更快,但我真的不明白。val_ptr以下代码中的地址本身不是立即数吗?

# Text section
.section __TEXT,__text,regular,pure_instructions
# 64-bit code
.code64
# Intel syntax
.intel_syntax noprefix
# Target macOS High Sierra
.macosx_version_min 10,13,0

# Make those two test functions global for the C measurer
.globl _test1
.globl _test2

# Test 1, imm64
_test1:
  # Move the immediate value 0xDEADBEEFFEEDFACE to RAX (return value)
  movabs rax, 0xDEADBEEFFEEDFACE
  ret
# Test 2, m64
_test2:
  # Move from the RAM (val_ptr) to RAX (return value)
  mov …
Run Code Online (Sandbox Code Playgroud)

optimization x86 assembly x86-64 micro-optimization

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

程序集自动跳转到下一个标签

我在汇编中编写了一个程序,如下所示:

%macro print 1

    push rbp

    mov rdi, %1
    xor rax, rax

    call _printf

    pop rbp

%endmacro    
section .data
    e db 'Equal', 0
    l db 'Less than', 0
    g db 'Greater than', 0
section .text
        global start
        extern _printf
    start:
        mov rax, 5
        mov rbx, 5
        cmp rax, rbx ; Compare 4 and 5
        je _equal ; je = jump if equal
        cmp rax, rbx
        jl _less ; jl = jump if less
        cmp rax, rbx
        jg _greater ; jg …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64

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