汇编语言数字转换

Assembly language number conversion

嘿,我目前正在学习汇编语言,但我在理解任何 Hex/bi/oct 数字到十进制的转换例程时遇到了困难

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;

我也想知道这个是如何转换的。我以为输入的是十六进制数,但它在哪里转换为十进制数?

所以...您通常 期望 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)
}

这个的实际组装会使用轮班和其他东西,但无论如何他们不会向您展示那个例程!相反,他们会告诉您更高级别的例程,这些例程执行 "conversion" for IO (input/output) 调用那些(未显示的)较低级别的函数。

他们在书中提出了两个重要观点:

By default, HLA displays all byte, word, and dword variables using the hexadecimal numbering system when you use the stdout.put routine. Likewise, HLA's stdout.put routine will display all register values in hex

这就是为什么 stdout.put( "The value ", value, " converted to hex is $", eax, nl );eax 注册为十六进制格式。 'nl' 只是一个换行符。

If you need to print the value of a register or byte, word, or dword variable as a decimal value, simply call one of the putiX

这就是为什么 stdout.puti32( ebx ) 在十进制中打印为 ebx 的原因。

最后一点 - 尽管根据您要显示数字的格式提供不同的输出函数,但输入函数是相同的:stdin.get 读取它们全部,但如果不是十进制,则必须在输入中包含一个说明符。

如书中所述:

  • 所有十六进制值都以“$”字符开头,例如 $123A4。
  • 所有二进制值都以百分号 ("%") 开头。
  • 小数没有前缀字符。
  • 如果从上下文中可以清楚地看出基数,则此文本可能会删除前导“$”或“%”字符。