Итак, я новичок в сборке, и в настоящее время я изучаю некоторые уроки по YT, а сейчас я перехожу к упражнению, которое должно напечатать целое число.Теперь я понял алгоритм, стоящий за всем этим кодом, или, точнее, процесс того, как он на самом деле печатает это целое число.Проблема в том, что я не уверен, что это точно , как я представляю это с точки зрения кода.
Например, мне дают digitSp, который будет содержать целое число,и digitSpPos, который должен действовать как своего рода индекс.Затем я перемещаю целое число в RAX и вызываю _printRAX.Пока что мне это кажется вполне понятным.Путаница начинается, когда я попадаю в метку _printRAX: здесь, насколько я понял, я добавляю значение перевода строки по адресу, указанному в RCX, затем мы увеличиваем значение в RCX и, наконец, передаем это значение вdigitSpPos.Все это довольно запутанно, потому что я не знаю точно, как это должно работать: моя цель как-то состоит в том, чтобы добавить перевод строки и увеличить «index», а затем передать обновленный индекс в digitSpPos.Но так ли это?Например, когда я это делаю, я просто передаю 100 байтов в rcx, поэтому, когда я делаю, я должен получить 101?И когда я это делаю, это перемещает значение перевода строки по адресу, указанному RCX, в то время как я думал, что digitSp будет содержать всю строку, которая уже была передана в RCX как значение.
В следующих двух циклах:опять же, запутанная часть есть только в разделе, когда я делаю то же самое, что и в _printRAX (я обновляю свой «индекс» и перемещаю числа по одному).В целом, вся идея состояла бы в том, чтобы разделить целое число на 10, взять каждый остаток и вставить его в RCX, пока я не воссоздаю число, но в обратном порядке.Затем я печатаю все от конца RCX до начала (давая мне целое число в правильном порядке плюс перевод строки).
Но возникают вопросы, почему я использую digitSp, если RCX собирается удерживатьцелое число?Почему я передаю каждое число в качестве значения в адресе, указанном RCX?Есть ли какое-то отношение к тому, как регистры просматривают те байты, которые им назначены?
Я прошу прощения, если мой вопрос немного странный, но мне бы очень хотелось понять, как все на самом деле работает, поскольку, как новичок, этопомог бы мне лучше понять идею программирования на ассемблере.Я обычно анализирую каждую программу и пытаюсь найти в ней смысл, но теперь, очевидно, у меня возникла небольшая проблема.
Код выглядит следующим образом:
section .bss
digitSp resb 100
digitSpPos resb 8
section .text
global _start
_start:
mov rax, 12345
call _printRAX
mov rax, 60
mov rdi, 0
syscall
_printRAX:
mov rcx, digitSp
mov rbx, 10
mov [rcx], rbx
inc rcx
mov [digitSpPos], rcx
_printRAXLoop:
mov rdx, 0
mov rbx, 10
div rbx
;push rax
add rdx, 48
;mov rcx, [digitSpPos]
mov [rcx], dl
inc rcx
mov [digitSpPos], rcx
;pop rax
cmp rax, 0
jne _printRAXLoop
_printRAXLoop2:
;mov rcx, [digitSpPos]
mov rax, 1
mov rdi, 1
mov rsi, rcx
mov rdx, 1
syscall
mov rcx, [digitSpPos]
dec rcx
mov [digitSpPos], rcx
cmp rcx, digitSp
jge _printRAXLoop2
ret
Есть несколько закомментированных строк, потому что, когда я анализировал код из учебника, эти строки казались избыточными (и проверяли это, выполняяпрограмма, они, видимо, были), но я оставил их на случай, если я действительно могу ошибаться.