高级汇编(HLA)中的十进制到二进制

时间:2015-10-12 16:26:28

标签: assembly binary decimal low-level hla

我有以下任务:编写一个HLA程序集程序,提示输入int8值,然后以二进制格式打印。例如,这里是各种输入值的程序输出

给我打印十进制值:15 15是0000_1111 给我打印十进制值:7 7是0000_0111

(提示:没有标准输出以二进制输出方式打印,因此您需要自己执行此操作。为了实现此目的,您需要在进位标记中移动一点并打印0或1,具体取决于你在Carry位找到了什么。转移并重复这个程序8次就完成了!最后,我们将学习如何循环,使这个任务变得不那么糟糕了。)

(第二个提示:LAHF将Carry Bit和所有其他标志从EFLAGS寄存器中推出并进入AH。作为汇编程序员,您有权通过使用屏蔽所有位而不是您感兴趣的位AND或OR。)以下是我目前在课堂上学到的内容:http://homepage.smc.edu/stahl_howard/cs17/FileManager/referenceguides/referenceguideii.htm 到目前为止,我的代码就是这个,我相信这是一个逻辑错误,因为无论我输入的是什么数字,我都会得到一个16 0&#39的字符串。

 begin program BinaryOutput;
 #include( "stdlib.hhf" );
 static
   iDataValue : int8;  // the value to inspect
 begin BinaryOutput;

    stdout.put( "Gimme a decimal value to print: ", nl);
    stdin.get( iDataValue );
    mov(0, BH);
    mov( iDataValue, BH);

    stdout.put("Number in binary is: ", nl);


    shl(1, BH); //1st
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //2nd
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //3rd
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //4th
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //5th
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //6th
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //7th
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);

    shl(1, BH); //8th
    lahf();
    and( %0000_0001, AH );
    mov(AH, BH);
    stdout.putb(BH);





 end BinaryOutput;

2 个答案:

答案 0 :(得分:0)

一个明显的错误是你覆盖了BH。这样的事情会更好:

shl(1, BH); //1st
lahf();
and( %0000_0001, AH );
stdout.putb(AH);

重复其他人,或使用循环;) 不确定putb使用什么格式,因为你提到了16个零,我猜它可能写了2个十六进制数字。在这种情况下,请检查您是否具有不同的输出功能(可能是puti8?)。如果没有打印单个数字,则打印字符(您必须通过添加'0''1'转换为ascii。)

答案 1 :(得分:-1)

stdout.puti8( BH );
stdout.put( " in binary is: %" );

    shl(1, BH); 
    lahf();
    //load AH with Flags
    and( %0000_0001, AH );
    //passing an arugement to AH[0]
    stdout.puti8( AH ); 
    //without i8, it outpouts 2 digits

这输出个位数,我不得不做同样的任务,这使它起作用。