Я пытался создать простую программу на ассемблере, которая печатает символ ascii, двоичный код которого находится в rax. У меня есть следующий код:
section .data
res db '', 0
global _start
_start:
mov rbx, 1000001
mov [res], rbx
mov rax, 1
mov rdi, 1
mov rsi, res
mov rdx, 1
syscall
mov rax, 60
xor rdi, rdi
syscall
Когда я выполняю, он выводит «A», что правильно, поскольку 1000001 — это двоичный код для ascii A, но если я выполню это:
section .data
res db '', 0
global _start
_start:
mov rbx, 1000010
mov [res], rbx
mov rax, 1
mov rdi, 1
mov rsi, res
mov rdx, 1
syscall
mov rax, 60
xor rdi, rdi
syscall
Он выводит «J», но согласно таблице, которую я использовал, 1000010 должен выводить «B». Что делает это еще более странным для меня, так это то, что если я использую десятичное число вместо двоичного, я получаю правильный результат. Что я делаю, вонг?





100000110 = F424116 и 4116 = 6510 = A ASCII
100001010 = F424A16 и 4A16 = 7410 = J ASCII
Почти дубликат: Как представить шестнадцатеричное значение, такое как FFFFFFBB, в программировании на ассемблере x86? включает
mov ax,1100_1000bи другой синтаксис, который NASM допускает для двоичных (с основанием 2) числовых констант. Конечно, вы должны простоmov ebx, 'B', если вы этого хотите.