大学费用计算器组装(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。一旦我这样做了,这只是我添加费用的一些小错误,然后它就可以正常工作了。
我正在用汇编语言编写,技术上是 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。一旦我这样做了,这只是我添加费用的一些小错误,然后它就可以正常工作了。