Измените значение метки, определенной в разделе bss, на «ev» в сборке x86

# #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 Да, когда я вчера ложился спать, я тоже думал об этом, но спасибо!