Ошибка ассемблерного кода 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

Что здесь не так, и как я могу это исправить?


person user2548833    schedule 14.07.2013    source источник
comment
программа не будет выводить общую оплату при вводе сверхурочных часов. Я не могу понять, где ошибка.   -  person user2548833    schedule 14.07.2013


Ответы (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;
}     
person Michael    schedule 14.07.2013
comment
@GitaarLAB: это C, который я использовал в качестве псевдокода, чтобы указать на логическую ошибку в коде OP и предложить более подходящий поток кода. Я оставлю это OP, чтобы внести фактические изменения кода сборки. - person Michael; 14.07.2013