TRAP продолжает печатать то же значение lc3
Итак, я пишу программу (в LC-3 ISA Machine Language, хотя я не уверен, является ли это реальным названием для конкретного типа кода машинного языка, это просто лучший способ, которым я могу описать его. Я новичок в машине языковое программирование, так что я не очень хорошо знаком с различными типами кода машинного языка) для LC-3, в котором я показываю количество раз, которое буква появляется в рифме (стихотворении) и стихе. Я должен сделать программу такой, чтобы она могла печатать количество раз, которое показывалось письмо (до числа 99).
Все хорошо, кроме последней инструкции, которая является TRAP x23(для печати). Я дважды использовал инструкцию trap, чтобы можно было распечатать две цифры (которые получаются путем деления счетчика на 10 и сохранения отношения и остатка в регистрах). Вот код:
0011000000000000 ;pc starts here
0101010010100000 ;clear r2
0010101000100011 ; ld x3500 r5
0010011000100000 ;ld x3012, r3
1111000000100011 ;trap in
0110001011000000 ;ldr r1, base r3(x3100),
0001100001111100 ;r4 = r1 - 4, top of loop
0000010000001100 ;start loop check if r1 == 4(if it does, exit)
1001001001111111 ;NOT R1 and store in R1
0001001001100001 ;Add r1 + 1 and store in r1
0001001001000000 ;Add r1 + r0 and store in r1
0000101000000101 ;skip if r1 != 0
0001010010100001 ;r2++
0101110110000000 ;clear r6
0001110110000011 ;r6 = r6 + r3
0111110101000000 ;str r6 in the address r5 points to.
0001101101100001 ;increment r5 pointer.
0001011011100001 ;r3++(increment pointer)
0110001011000000 ;ldr into r1, content in the address r3 points to.
0000111111110010 ;GOTO TOP OF LOOP
;COUNT DIVISION
0101101100000000 ;clear r5
0001010010100000 ;r2 = r2(changes the flags for the upcoming loop).
0000110000000101 ;if r2 is <= 0, skip loop
0011010000001111 ; store r2 in PC + 15
0001010010110110 ;r2 = r2 - 10
0000110000000001 ; if r2 is negative or zero, skip the next instruction.
0001101101100001 ;r5++
0000111111111010 ;go to top of loop
0010010000001010 ;load value in PC + 10 to r2(remainder).
0010000000000111 ;LD into r0 x3014
0001000000000101 ;Add r0 and x3013(ASCII character) store in r0
1111000000100001 ;trap print out quotient
0101000000100000 ;clear r0
0001000000000010 ; r0 = r0 + r2
1111000000100001 ;trap print out remainder.
1111000000100101 ;HALT
0011000100000000 ;data variables
0000000000110000
0011010100000000 ;x3500
До того, как я использовал регистр 0 для распечатки остатка (в правилах 2), я использовал его только для распечатки фактора, и я использовал следующий код, чтобы попытаться изменить значение, которое собиралось напечатать (я думал, что TRAP x23 выведет значение последнего вызванного регистра):
0001010010100000 ;r2 = r2 + 0
Но он только напечатал частное дважды, поэтому я попытался сделать следующее, чтобы увидеть, изменится ли что-нибудь:
0101001001100000 ;clear r1
0001001001000010 ;r1 = r1+r2
Ничего не сделал Поэтому я начал верить, что TRAP x23 выводит значения только r 0, поэтому я изменил код на:
0101000000100000 ;clear r0
0001000000000010 ;r0 = r0 + r2
Но консоль напечатала частное с пустым контуром рядом с ним.
1 ответ
Вы имеете в виду Trap x21 (OUT)? ваш код не показывает Trap x23. Ловушка x23 - это IN, которая читает символ, а не то, что вам нужно.
Ничего не сделал Поэтому я начал верить, что TRAP x23 выводит значения только r0, поэтому я изменил код на:
Да из документа ISA для TRAP x21
OUT: записать символ в R0[7:0] на дисплей консоли.
Он напечатает только младшие восемь битов R0.
Но консоль напечатала частное с пустым контуром рядом с ним.
Запомните таблицу ASCII, если R0 содержит 0, она не выведет 0, а символ NUL из таблицы ниже. Если вы хотите распечатать 0, тогда R0 должен содержать 48. Если вы хотите напечатать 1, то 49 и так далее.