我已经编写了一个函数来计算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 …
我正在为 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,我不想使用它(它会给我很多重复项)。我该如何解决这个问题?
我正在 GNU 中编写一个小型引导加载程序as,我需要使二进制输出“与 BIOS 兼容”。这是我如何做到的nasm:
...
times 510 - ($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)
但是我怎么能在 GNU 中做到呢as?
我正在用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节点在屏幕上的大小?
我听说x87 FPU可以使用80位浮点数,所以即使我想用64位数进行计算,它也会用80位计算它然后转换它.但是在x86-64上的Swift中最快,Double或者Float80(计算算术时)?
我设法访问了multiboot_info_ti386 内核中的 GRUB 多引导信息结构 ( ),并且有两个字段分别称为mem_lower和mem_upper。我如何使用它们来获取总可用 RAM(以字节为单位)?
经过大约100亿次测试,如果imm64比m64AMD64快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) 我在汇编中编写了一个程序,如下所示:
%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)