大学费用计算器组装(HLA)程序

College Fee Calculator Assembly(HLA) program

我正在用汇编语言编写,技术上是 HLA(高级汇编语言),但在作业中遇到了问题。这是作业:


编写一个 HLA 汇编语言程序来计算圣莫尼卡学院的学生入学费用。 (因为我们只知道如何处理整数运算,所以我们的程序会稍微不准确)。截至 2014 年秋季,居民的注册费为 46 美元/单元,所有其他学生的注册费为 335 美元/单元。学生服务费冬季或夏季为 48 美元,秋季为 51 美元或 Spring。停车贴花是可选的,Fall/Spring 中的价格为 85 美元,Winter/Summer 中的价格为 45 美元。

注册费将根据用户输入的单个 8 位值输入。费用将采用以下格式:prsseeee,其中 ss 是对应于学期的两位值(秋季为 00,冬季为 01,Spring 为 10,夏季为 11),eeee 为四位值对应于注册单位的数量,r 是对应于学生是否是加州居民的一位,p 是对应于是否需要停车贴花的一位。该位字段的格式如下图所示:

费用的打包位字段 由于只输入了 8 位,您的程序应该期望读取 2 个十六进制数字。

下面是一些演示这些想法的示例程序对话。 (提示:一点一点地逐步执行此操作。其中有很多...) (进一步提示:这个作业最重要的部分是与用户输入的打包数据字段一起工作,从中提取子部分。英特尔寄存器的重叠设计帮助你解析这种数据字段,你可以移动位以将正确的部分放入 BH 或 BL,例如......) (进一步提示:您可以通过直接读入寄存器来读取十六进制数。) (最后提示:由于我们还没有学会如何做乘法,虽然有点痛苦,但我希望你能通过一组循环的加法指令来执行乘法)

喂我(2 个十六进制数字和 prsseeee 位):CC
秋季学期
12 个单位
加州居民
停车
总费用 = 688 美元

喂我(2 个带 prsseeee 位的十六进制数字):4C
秋季学期
12 个单位
加州居民
禁止停车
总费用 = 603 美元

喂我(2 个带 prsseeee 位的十六进制数字):8C
秋季学期
12 个单位
非居民
停车
总费用 = 4156 美元


喂我(2 个带 prsseeee 位的十六进制数字):0C
秋季学期
12 个单位
非居民
禁止停车
总费用 = 4071 美元

喂我(2 个带 prsseeee 位的十六进制数字):D1
冬季学期
1个单位
加州居民
停车
总费用 = 139 美元

喂我(2 个带 prsseeee 位的十六进制数字):91
冬季学期
1个单位
非居民
停车
总费用 = 428 美元


这是我的代码:

program SMCFee;
#include( "stdlib.hhf" );
 static
   total : int32 := 0;

   begin SMCFee;

   stdout.put("Feed me(2 hex digits with the bits prsseeee):");
   stdin.get(BL);
   mov(total,EAX);
   mov(BL,AL);
   shr(4,AL);
   and( %0000_0011, AL );
   cmp(AL, 00);
   je Fall;
   cmp(AL, 10);
   je Spring;
   jmp Win;

   Fall:
   stdout.put("Fall Semester", nl);
       mov(BL,AL);
       shr(7,AL);
       and( %0000_0001, AL );
       cmp(AL,1);
       je SprFallPark;
       add(51, EAX);
       jmp ResCheck;

   Spring:
        stdout.put("Spring Semester", nl);
        mov(BL,AL);
        shr(7,AL);
        and( %0000_0001, AL );
        cmp(AL,1);
        je SprFallPark;
        stdout.put("No parking", nl);
        add(51, EAX);
        jmp ResCheck;

   SprFallPark:
        stdout.put("Parking", nl);
       add(136, EAX);
       jmp ResCheck;

   Win:
        cmp(AL, 11);
        je Summer;
        stdout.put("Winter Semester", nl);
       mov(BL,AL);
       shr(7,AL);
       and( %0000_0001, AL );
       cmp(AL,1);
       je WinSumPark;
       stdout.put("No Parking", nl);
       add(51, EAX);
       jmp ResCheck;

       Summer:
       stdout.put("Summer Semester", nl);
       mov(BL,AL);
       shr(7,AL);
       and( %0000_0001, AL );
       cmp(AL,1);
       je WinSumPark;
       stdout.put("No parking");
       add(51, EAX);
       jmp ResCheck;
   WinSumPark:
        stdout.put("Parking", nl);
       add(133, EAX);
       jmp ResCheck;

   ResCheck:
       mov(BL,AL);
       shr(6,AL);
       and( %0000_0001, AL );
       cmp(AL,1);
       je Res;
       stdout.put("Non-Resident", nl);
       mov(335,EDX);
       jmp CalcUnits;
   Res:
        stdout.put("CA Resident", nl);
       mov(46,EDX);
       jmp CalcUnits;

   CalcUnits:

   ForLp:
   mov(BL, AL);
   and(%0000_1111, AL);
   stdout.puti8(AL);
   stdout.put(" units", nl);
   ForLpTerminationTest:
   cmp(AL, 0);
   jle ForLpDone;
   ForLpBody:
   add(EDX, EAX);
   ForLpDecrement:
   dec(AL);
   jmp ForLpTerminationTest;
   ForLpDone:

   stdout.put("Total Fees = $");
   stdout.puti32(EAX);

   end SMCFee;

肯定是逻辑问题,假设我输入的是cc。它打印出正确的字符串,但总数是错误的。如果我输入 4c,我会得到正确的字符串,但停车除外。它完全跳过了这一点,总的来说是错误的well.Thank 你的帮助。

编辑:这是我输入 CC 时的结果图片。如您所见,它正确地输入了类别,但没有得到相同的结果。我相信我的问题是我如何拥有声明标签。

Michael Petch 的评论解决了这个问题。问题是我正在写入 AL 和 AH,这会破坏 EAX 中的数据。我将 "total" 寄存器更改为 ECX。一旦我这样做了,这只是我添加费用的一些小错误,然后它就可以正常工作了。