我正在编写大会,技术上是HLA(高级程序集),并且在编写时遇到问题。这是作业:
写一个HLA汇编语言程序,计算圣莫尼卡学院的学生注册费。 (因为我们只知道如何处理整数运算,我们的程序会稍微不准确)。截至2014年秋季,居民的入学费为46美元/单位,其他所有人的入学费为335美元/单位。冬季或夏季的学生服务费为48美元,秋季或春季的学生服务费为51美元。停车贴纸的选择是可选的,秋季/春季需要85美元,冬季/夏季需要45美元。
将根据用户输入的单个8位值输入注册费。费用将采用以下格式:prsseeee,其中ss是对应于学期的两位值(秋季为00,冬季为01,春季为10或夏季为11),eeee是对应于该数字的四位值在登记单位中,r是对应于学生是否是加利福尼亚居民的单个位,并且p是对应于是否需要停车贴花的单个位。该位字段的格式如下图所示:
收费的比特字段 由于只输入了8位,因此您的程序应该读取2个十六进制数字。
以下是一些演示这些想法的示例程序对话。 (提示:这是小步骤,一点一点地做的。有很多......) (进一步提示:此任务中最重要的部分是使用用户输入的打包数据字段从中提取子部分。英特尔寄存器的重叠设计可帮助您解析此类数据字段并且您可以移动位以使正确的部分进入BH或BL,例如...) (进一步提示:您可以通过直接读入寄存器来读取十六进制数字。) (最后提示:由于我们还没有学会如何进行乘法运算,虽然它有点痛苦,但我期待你通过一组循环的加法指令来执行乘法运算)
喂我(2位十六进制数字,位为prsseeee):CC
秋季学期
12个单位
CA居民
停车场
总费用= 688美元
喂我(带有prsseeee的位的2个十六进制数字):4C
秋季学期
12个单位
CA居民
禁止停车
总费用= 603美元
喂我(2位十六进制数字,位为prsseeee):8C
秋季学期
12个单位
非居民
停车场
总费用= 4156美元
喂我(2位十六进制数字,位为prsseeee):0C
秋季学期
12个单位
非居民
禁止停车
总费用= 4071美元
喂我(带有prsseeee位的2个十六进制数字):D1
冬季学期
1个单位
CA居民
停车场
总费用= 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,我会得到正确的字符串,除了停车。它完全跳过了这一点,并且总数也是错误的。谢谢你的帮助。
编辑:这是我输入CC时我的结果的图片。正如您所看到的,它正确地键入了类别,但它没有得到相同的结果。我相信,我的问题是如何使用声明标签。
答案 0 :(得分:2)
因此Michael Petch的评论解决了这个问题。问题是我正在写入AL和AH,它正在将数据销毁到EAX中。我将“总”寄存器更改为ECX。一旦我这样做,只是一些小错误,我如何添加费用,然后它正常工作。