2015-11-21 42 views
1

我正在组装,技术上讲是HLA(高级组装),并且在作业时遇到问题。这是作业:大学学费计算器组装(HLA)程序


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

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

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

下面是一些演示这些想法的示例程序对话框。 (提示:一点一点地做这件事,它有很多东西......) (更多提示:此作业最重要的部分是处理用户输入的打包数据字段以提取英特尔寄存器的重叠设计可以帮助您解析这种数据字段,并且您可以移动这些位以将正确的部分转换为BH或BL,例如...) (Further Hint :您可以通过直接读入寄存器来读取十六进制数字。) (最后提示:由于我们还没有学会如何进行乘法,虽然这有点痛苦,但我期待着你可以通过循环加法指令执行乘法)

喂我(2个十六进制数字与位prsseeee):CC
秋季学期
12个单位
CA驻地
停车
总费用= $ 688

订阅我(2位十六进制数字prsseeee):4C
秋季学期
12个单位
CA居民
没有停车场
总费用= $ 603

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


订阅我(2位十六进制数字prsseeee):0℃
秋季学期
12个单位
非居民
没有停车场
总费用= $ 4071

订阅我(2位十六进制数字prsseeee):D1
冬季学期
1单元
CA驻地
停车
总费用= $ 139

订阅我(2位十六进制数字prsseeee):9 1
冬季学期
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,我会得到正确的字符串,除了停车。它完全跳过了,总的错误也是如此。谢谢你的帮助。

编辑:下面是我输入CC时的结果图片。正如你所看到的,它正确地输出了类别,但没有得到相同的结果。我相信,我的问题是我如何拥有声明标签。 Console Window Results

+0

如果您只是向每个人展示一个简短的示例,展示您遇到的特定问题,您将会获得更好的结果。这不是人们为你做功课的地方。 –

+1

您是否知道EAX实际上是AL和AH寄存器的组合?如果更改AL或AH,它会更改EAX的值(AH = EAX的高8位,AL是EAX的低8位)。 AH和AL是EAX的一部分。我问,因为我看到你总是进入EAX,然后通过操纵AH和AL来破坏EAX。看起来好像你可能认为AH和AL完全独立于EAX –

+3

@ BenLindsay:我不同意。分配问题很长,但代码相当简单(并且相当短)。他显然已经尝试了这项任务,并告诉我们输入是什么,预期输出,并给了我们一个错误输出的例子(他的输出不应该是屏幕抓取,而只是将问题粘贴到文本中)。由于许多作业问题最终都会在这个网站上出现,这个问题肯定比他们中的很多人都要好。这绝对不是Codez_的问题。 –

回答

3

因此,迈克尔佩奇的评论解决了这个问题。问题是我正在写入AL和AH,这些数据正在将数据摧毁到EAX中。我将“总计”寄存器更改为ECX。一旦我这样做了,这只是我添加费用的一些小错误,然后它正常工作。