高级汇编 (HLA) 中的十进制到二进制
Decimal to Binary in High Level Assembly (HLA)
我有以下任务:编写一个 HLA 汇编程序,提示输入一个 int8 值进行检查,然后以二进制格式打印它。例如,这里是各种输入值的程序输出
给我一个要打印的十进制值:15
15 是 0000_1111
给我一个要打印的十进制值:7
7 是 0000_0111
(提示:没有以二进制输出打印的标准输出,所以你需要自己做这个。为了完成这个,你需要每次移动一个位到进位标志并打印0或1 ,取决于您在进位位中找到的内容。移位并重复此过程 8 次,您就完成了!最终,我们将学习如何循环,使这项任务变得不那么糟糕。)
(第二个 Hint:LAHF 将进位位和所有其他标志推出 EFLAGS 寄存器并送入 AH。作为汇编程序员,您有权屏蔽除您所在的位以外的所有位对使用 AND 或 OR 感兴趣。)这是我目前在 class 中学到的内容:http://homepage.smc.edu/stahl_howard/cs17/FileManager/referenceguides/referenceguideii.htm
到目前为止,我的代码是这样的,我认为这是一个逻辑错误,因为无论我输入什么数字,我只会得到一串 16 个 0。
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;
一个明显的错误是您覆盖了 BH
。这样的东西应该会更好:
shl(1, BH); //1st
lahf();
and( %0000_0001, AH );
stdout.putb(AH);
对其他人重复,或使用循环 ;)
不确定 putb
使用什么格式,因为你提到得到 16 个零,我猜它可能写了 2 个十六进制数字。在那种情况下,请检查您是否有不同的输出函数(可能 puti8
?)。如果 none 打印单个数字然后打印字符(您必须转换为 ascii 然后添加 '0'
或 '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
这输出个位数,我不得不做同样的作业,这让它起作用了。
我有以下任务:编写一个 HLA 汇编程序,提示输入一个 int8 值进行检查,然后以二进制格式打印它。例如,这里是各种输入值的程序输出
给我一个要打印的十进制值:15 15 是 0000_1111 给我一个要打印的十进制值:7 7 是 0000_0111
(提示:没有以二进制输出打印的标准输出,所以你需要自己做这个。为了完成这个,你需要每次移动一个位到进位标志并打印0或1 ,取决于您在进位位中找到的内容。移位并重复此过程 8 次,您就完成了!最终,我们将学习如何循环,使这项任务变得不那么糟糕。)
(第二个 Hint:LAHF 将进位位和所有其他标志推出 EFLAGS 寄存器并送入 AH。作为汇编程序员,您有权屏蔽除您所在的位以外的所有位对使用 AND 或 OR 感兴趣。)这是我目前在 class 中学到的内容:http://homepage.smc.edu/stahl_howard/cs17/FileManager/referenceguides/referenceguideii.htm 到目前为止,我的代码是这样的,我认为这是一个逻辑错误,因为无论我输入什么数字,我只会得到一串 16 个 0。
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;
一个明显的错误是您覆盖了 BH
。这样的东西应该会更好:
shl(1, BH); //1st
lahf();
and( %0000_0001, AH );
stdout.putb(AH);
对其他人重复,或使用循环 ;)
不确定 putb
使用什么格式,因为你提到得到 16 个零,我猜它可能写了 2 个十六进制数字。在那种情况下,请检查您是否有不同的输出函数(可能 puti8
?)。如果 none 打印单个数字然后打印字符(您必须转换为 ascii 然后添加 '0'
或 '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
这输出个位数,我不得不做同样的作业,这让它起作用了。