Путаница с печатью (целое число с несколькими цифрами) в сборке (NASM) - PullRequest
0 голосов
/ 17 февраля 2019

Итак, я новичок в сборке, и в настоящее время я изучаю некоторые уроки по 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

Есть несколько закомментированных строк, потому что, когда я анализировал код из учебника, эти строки казались избыточными (и проверяли это, выполняяпрограмма, они, видимо, были), но я оставил их на случай, если я действительно могу ошибаться.

...