ассемблер pdp 11 — проблемы с вспомогательной командой

#assembly #cpu-registers #pdp-11

#сборка #процессор-регистры #pdp-11

Вопрос:

итак, мы используем симулятор pdp 11, и я пытаюсь таким образом вычесть один регистр из другого:

вспомогательные r2, r4

я хочу, чтобы r4 содержал разницу между значениями, хранящимися в r2 и r4, вместо этого я получаю огромное, не связанное число. я попробовал sub r2, r5 и это та же проблема.

где я не прав? вот код: (строка после флага «kaka»)

 .=torg 1000
main:

mov n_cols, r0
mul n_rows, r0
mov r1, r0;     r0 is now the length of the array of the maze
mov #Board, r2
mov #Path,r3;
loop:
cmpb (r2),#'S
beq loop2
tst (r2) 
sob r0, loop ;Go to next iteration

loop2:
cmpb (r2), #1
beq illegal
mov #Board,r4
kaka:
sub r2, r4
waka:
bmi illegal
  

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

Ответ №1:

Прошло несколько десятилетий с тех пор, как я играл с ассемблером PDP 11; но sub r2, r4 вычитает r4 ИЗ r2. Вы должны использовать sub r4, r2 и соответствующим образом изменить остальной код.

Комментарии:

1. да, это старый компьютер, но я пытаюсь вычесть r4 из r2 и поместить его в r4. теперь я заметил, что огромное число, которое я получаю в r4, является дополнением 2 к реальному значению, которое я хочу! что здесь не так?

2. sub r4,r2 это похоже на написание r4 = r4 - r2 . Это даст вам дополнение к двум r2 - r4 . Просто neg r4 и у вас есть свой ответ.

3. mov r1, r2 sub r1, r4 mov r4, r1

4.Вы могли заметить, что r2 — r4 также является -r4 r2, так почему бы не попробовать neg r4 add r4, r2 ?

5. Я не знаком с PDP-11 и даже не имел возможности работать с машинами PDP в старые времена, но я только что посмотрел в руководстве PDP-11 от 1969 года: sub src, dst делает dst < dst-src , в то время как cmp src, dst создает флаги < src-dst. Причина, по которой topicstarter получает странные результаты, вероятно, заключается в том, что r2 указывает на некоторую память, прошедшую метку платы после некоторых циклов, в то время как r4 загружен с помощью платы. Таким образом, при вычитании r2 из r4 он получает отрицательное число, которое также может быть интерпретировано как огромное положительное целое число. Если ему нужно получить положительную разницу, он мог бы выполнить «sub r4, r2» и получить разницу в r2.