Код сборки Pep9 - Не получается правильный вывод - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу программу (в сборке PEP9), которая должна вывести -1 в начале, затем взять строчный символ ASCII в качестве ввода, преобразовать его в верхний регистр и вывести его.

Пока у меня есть:

LDWA 0xFFFF, i 
DECO 0xFFFF, i
LDBA 0xFC15, d
STWA 0x001D, d
STBA 0xFC16, d
LDWA 0x001D, d
SUBA 0x001F, d
ORA 0x0021, d
STBA 0xFC16, d
STOP 

.BLOCK 2
.WORD 20
.WORD 0x0020
.END

Всякий раз, когда я запускаю его со своим вводом, он вместо этого добавляет 20h вместо вычитания 20h, чтобы сделать верхний регистр символов ASCII. Есть указатели?

1 Ответ

0 голосов
/ 01 октября 2019

Переназначение вашего кода с адресами (и некоторыми комментариями) упрощает определение потенциальных проблем:

0000  LDWA 0xFFFF, i    ; set A to -1, why?
0003  DECO 0xFFFF, i    ; decimal output -1
0006  LDBA 0xFC15, d    ; get input character
0009  STWA 0x001D, d    ; store to variable
000c  STBA 0xFC16, d    ; output character
000f  LDWA 0x001D, d    ; get character back
0012  SUBA 0x001F, d    ; presumably subtract 0x20
0015  ORA  0x0021, d    ; not sure what this intends
0018  STBA 0xFC16, d
001b  STOP              ; 1-byte operation

001c  .BLOCK 2          ; two arbitrary bytes.
001e  .WORD 20          ; takes two bytes 0x0014
0020  .WORD 0x0020      ; 0x0020
.END

Исходя из этого, вы, похоже, использовали неправильные адреса для прямого храненияи поиск, возможно, потому что вы думаете, STOP является двухбайтовой операцией, но я не уверен.

В дальнейшем вы сможете избавиться от лишнего кода и убедиться, что вы используете только заглавные буквы в нижнем регистре. действуя только в диапазоне (включительно) a..z. Примерно так будет хорошим началом:

asc_a:    .equate  0x0061      ; Lower case A.
asc_z:    .equate  0x007a      ; Lower case Z.
sub_val:  .equate  0x0020      ; Difference from upper to lower.
in_char:  .equate  0xfc15      ; Address to get char from user.
out_char: .equate  0xfc16      ; Address to put char to user.

main:     deco     0xffff,i    ; Decimal output -1.

          ldba     in_char,d   ; Get input character.

          cpwa     asc_a,i     ; If outside a..z, do not translate.
          brlt     no_xlat
          cpwa     asc_z,i
          brgt     no_xlat

          suba     sub_val,i   ; Convert to upper (61..7a -> 41..5a).

no_xlat:  stba    out_char,d   ; Output character.
          stop

Там вы увидите, что нам на самом деле не нужно хранилище данных, так как мы можем просто использовать немедленный операнды для констант и аккумулятор для самого символа.


Если вам нужно сделать хранение данных, я бы хотел разместить его в фиксированном месте, чтобы изменения кода не влиялиэто что-то вроде:

0000   start:       br       main

0003   some_data:   .block   0x20
0023   more_data:   .word    0xdead
0026   more_data:   .word    0xbeef

0029   main:        <<Code goes here>>

Таким образом, никакие изменения в коде не влияют на ваши переменные, что будет весьма удобно, если вам придется вручную кодировать свои вещи, а не полагаться на достойного ассемблера, который можетотработать символы автоматически.

...