Я собрал ваш asm с gcc -c foo.S
, так как думал, что получу ошибку времени сборки от byte
вместо byte ptr
и несоответствие с регистром слов.
В GASсинтаксис byte
оценивается как целочисленная константа 1
, поэтому mov byte [rsi], rax
эквивалентно mov 1[rsi], rax
.Это допустимо в синтаксисе GAS и эквивалентно [1+rsi]
Когда вы разбираете foo.o
с objdump -dwrC -Mintel
, вы видите
0000000000000000 <u8_to_u64>:
0: 48 c7 c0 ff 00 00 00 mov rax,0xff
7: 48 89 46 01 mov QWORD PTR [rsi+0x1],rax
b: 48 c7 c0 ee 00 00 00 mov rax,0xee
12: 48 89 47 01 mov QWORD PTR [rdi+0x1],rax
16: 48 31 c0 xor rax,rax
19: c3 ret
Обратите внимание на [rsi+1]
и [rdi+1]
режимы адресации.
Синтаксис GAS для того, что вы пытаетесь сделать:
mov byte ptr [rsi], 0xff
mov byte ptr [rdi], 0xee
xor eax,eax
ret
Или с глупыми дополнительными инструкциями, чтобы сначала выполнить mov-немедленный доступ к регистру:
mov eax, 0xff
mov [rsi], al
mov eax, 0xee # mov al, 0xee is shorter but false dependency on the old RAX
mov [rdi], al
xor eax,eax
ret