我正在組裝,技術上講是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時的結果圖片。正如你所看到的,它正確地輸出了類別,但沒有得到相同的結果。我相信,我的問題是我如何擁有聲明標籤。
如果您只是向每個人展示一個簡短的示例,展示您遇到的特定問題,您將會獲得更好的結果。這不是人們爲你做功課的地方。 –
您是否知道EAX實際上是AL和AH寄存器的組合?如果更改AL或AH,它會更改EAX的值(AH = EAX的高8位,AL是EAX的低8位)。 AH和AL是EAX的一部分。我問,因爲我看到你總是進入EAX,然後通過操縱AH和AL來破壞EAX。看起來好像你可能認爲AH和AL完全獨立於EAX –
@ BenLindsay:我不同意。分配問題很長,但代碼相當簡單(並且相當短)。他顯然已經嘗試了這項任務,並告訴我們輸入是什麼,預期輸出,並給了我們一個錯誤輸出的例子(他的輸出不應該是屏幕抓取,而只是將問題粘貼到文本中)。由於許多作業問題最終都會在這個網站上出現,這個問題肯定比他們中的很多人都要好。這絕對不是Codez_的問題。 –