0

嘿,我目前正在学习汇编语言,但我无法理解任何 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;

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

4

1 回答 1

0

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

为此的实际组装将使用轮班之类的东西,但无论如何它们都不会向您展示该例程!相反,它们会告诉您执行 IO(输入/输出)“转换”的更高级别的例程调用那些(未显示的)较低级别的函数。

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

默认情况下,当您使用 stdout.put 例程时,HLA 使用十六进制编号系统显示所有字节、字和双字变量。同样,HLA 的stdout.put例程将以十六进制显示所有寄存器值

这就是为什么stdout.put("The value ", value, " 转换为十六进制是 $", eax, nl ); 以十六进制格式 打印eax寄存器中的值。'nl' 只是一个换行符。

如果您需要将寄存器或字节、字或双字变量的值打印为十进制值,只需调用其中一个putiX

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

最后一点 - 尽管根据您要显示数字的格式提供不同的输出功能,但输入功能是相同的:stdin.get会读取所有内容,但如果输入不是十进制,则必须在输入中包含说明符。

如书中所述:

  • 所有十六进制值都以“$”字符开头,例如 $123A4。
  • 所有二进制值都以百分号 ("%") 开头。
  • 十进制数没有前缀字符。
  • 如果从上下文中清除了基数,则此文本可能会删除前导“$”或“%”字符。
于 2018-01-14T10:12:17.383 回答