Преобразование номера языка ассемблера
Эй, я в настоящее время беру язык ассемблера и застрял для понимания процедуры преобразования любого шестнадцатеричного / би / октанового числа в десятичное
program ConvertToDecimal;
#include( "stdlib.hhf" )
static
value: int32;
begin ConvertToDecimal;
stdout.put( "Input a hexadecimal value: " );
stdin.get( ebx );
mov( ebx, value );
stdout.put( "The value $", ebx, " converted to decimal is ", value, nl );
end ConvertToDecimal;
Это код, приведенный в учебнике, и я не совсем понимаю, в какой части и как шестнадцатеричное число преобразуется в десятичное число
Также
program ConvertToDecimal2;
#include( "stdlib.hhf" )
begin ConvertToDecimal2;
stdout.put( "Input a hexadecimal value: " );
stdin.get( ebx );
stdout.put( "The value $", ebx, " converted to decimal is " );
stdout.puti32( ebx );
stdout.newln();
end ConvertToDecimal2;
Интересно, как этот преобразует? Что я думал, было ввести шестнадцатеричное число, но где оно преобразуется в десятичное число?
1 ответ
Итак... обычно вы ожидаете, что функция ConvertToHex будет выглядеть примерно так:
PrintAsHex(val) {
do {
digit = val mod 16; // get the rightmost digit (in Hex)
if digit < 10 print digit; // print 0-9
else print val('A' + (digit-10)) // print A-F
val = val / 16; // shift down next digit
} while (val > 0)
}
Фактическая сборка для этого будет использовать сдвиги и прочее, но в любом случае они не показывают вам эту рутину! Вместо этого они рассказывают вам о процедурах более высокого уровня, которые выполняют "преобразование" для ввода-вывода (ввода / вывода), вызывая эти (не показанные) функции более низкого уровня.
Они делают два важных момента в книге:
По умолчанию HLA отображает все переменные byte, word и dword, используя шестнадцатеричную систему нумерации, когда вы используете процедуру stdout.put. Аналогично, процедура HLA stdout.put будет отображать все значения регистров в шестнадцатеричном виде.
Вот почему stdout.put( "Значение", значение, "преобразованное в шестнадцатеричное значение, равно $", eax, nl); печатает значение в регистре eax в шестнадцатеричном формате. 'nl' это просто перевод строки.
Если вам нужно вывести значение регистра или переменную байта, слова или слова как десятичное значение, просто вызовите один из putiX
Вот почему stdout.puti32( ebx) печатает как ebx в десятичном формате.
Последнее замечание - хотя в зависимости от того, в каком формате вы хотите отобразить число, предусмотрены разные функции вывода, функция ввода одинакова: stdin.get читает их все, но вы должны включить спецификатор во вход, если он не десятичный.
Как отмечено в книге:
- Все шестнадцатеричные значения начинаются с символа "$", например, $123A4.
- Все двоичные значения начинаются со знака процента ("%").
- Десятичные числа не имеют префиксного символа.
- Если основание видно из контекста, в этом тексте может быть пропущен начальный символ "$" или "%".