Ошибка кода сборки OAM
Я не могу рассчитать регулярную оплату в этом коде. Он просто вычисляет ставку сверхурочных часов, а не полную оплату, включая обычную оплату. Вот ссылка на компилятор OAMulator.
SET 40 #put the value 40 into the accumulator
STA 50 #store the value 40 in address 50 (I chose 50 arbitrarily)
SET 1.5 #put the value 1.5 into the accumulator
STA 51 #store the value 1.5 in address 51
LDA 0 #input the number of hours worked
STA 52 #store the number of hours worked in address 52
LDA 0 #input the payrate
STA 53 #store the payrate at address 53
LDA 52 #load the number of hours worked into the accumulator
SUB 50 #subtract the number 40 (stored in address 50)
STA 54 #store overtime hours at address 54
BRP RT #if hours is more than 40, branch to overtime
LDA 50 #load 40 into the accumulator
MLT 53 #multiply by the payrate.
STA 55 #store REGULAR PAY pay in address 55
RT, LDA 52 #load the number of hours worked
LDA 54 #overtime hours
MLT 51 #overtime rate
MLT 53 #payrate
ADD 55 #add the regular pay
STA 56 #all of the pay
BR FINAL #branch to where you are going to print the week's pay
STA 56 #store total pay including regular pay and overtime pay in address 56
FINAL,STA 0 #output final pay
HLT
Что здесь не так, и как я могу это исправить?
1 ответ
BRP RT #if hours is more than 40, branch to overtime
Эта ветвь пропускает код, который вычисляет регулярную оплату, если количество отработанных часов превышает 40. Итак, в данный момент вы делаете что-то вроде этого:
if (overtime_hours <= 0) {
regular_pay = 40 * pay_rate;
}
// Here regular_pay might not have been calculated
total_pay = overtime_hours * overtime_rate * pay_rate + regular_pay;
Когда то, что вы на самом деле хотите, вероятно, примерно так:
regular_pay = 40 * pay_rate;
total_pay = regular_pay;
if (overtime_hours > 0) {
total_pay = total_pay + overtime_hours * overtime_rate * pay_rate;
}