# #assembly #x86 #base64 #x86-64
Вопрос:
Здравствуйте, в настоящее время я работаю над кодером base64, написанным на сборке x86. Я уже почти все сделал, но у меня все еще есть небольшая проблема.
Я определил длину выходного буфера 4, потому что обычно записывается 4 байта символов ascii.
SECTION .bss OutputBufLen: equ 4
Так что теперь, если есть только один или два байта чтения ввода, я хочу записать только два или три байта в stdout.
Есть ли способ, которым я могу изменить значение OutputBufLen
? Я пытался это сделать mov [OutputBufLen], 3
, но потом мне нужно указать размер byte
, но, по-моему, это кажется слишком большим. И dec
тоже, похоже, не работает.
Часть записи:
printOutputBuf: mov rax, 1 mov rdi, 1 mov rsi, OutputBuf mov rdx, OutputBufLen syscall
Не могли бы вы дать мне несколько советов? Извините, если я пропустил какую-то важную информацию, но я довольно новичок в этом деле.
Комментарии:
1. Какой ассемблер вы используете?
2. Нет,
equ
это конструкция времени компиляции. Вместо этого используйте переменную времени выполнения, напримерOutputBufLen dq 4
, а затем получите доступ как[OutputBufLen]
.3. Обратите внимание, что раздел BSS может содержать только материалы с нулевой инициализацией, такие как
dq 0
илиresq 1
илиresb 8
. Нетdq 4
. Если вы хотите, чтобы он был статически инициализирован4
, но затем перезаписан позже, он должен быть.data
включен .4. Но на самом деле общий размер буфера и используемая в настоящее время длина-это разные вещи. Вам нужна длина буфера, когда вы читаете в него новые входные данные, и вам нужна длина вашего последнего
read
(возвращаемого значения), когда вы собираетесь перебирать его илиwrite
его в другой файловый дескриптор.5. @PeterCordes Да, когда я вчера ложился спать, я тоже думал об этом, но спасибо!