Задачи на ассемблере PDP-11
Сложение двух чисел
. = 1000 ; расположить следующую команду по 1000 адресу
MOV #2, R0 ; записать 2 в R0
MOV #3, R1 ; записать 3 в R1
ADD R0, R1 ; сложить содержимое R0 и R1, результат записать в R1
HALT ; остановить выполнение программы
Суммирование массива заданной длины
. = 100 ; данные располагаются с 100 адреса
A: .BYTE 34, 12, -1, 66 ; массив (А - константа, равна адресу 100), сумма = 133, так как все числа восьмеричные
N: .BYTE 4 ; размер массива А
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sum all data in the A array and store the summ into R0
; R0 - sum
; R1 - counter
; R2 - address
; R3 - (byte)A[R1]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.=1000 ; код располагается с 1000 адреса
mov #4, R1 ; замените потом #4 на @#N и отладьте 3 моду
mov #A, R2 ; R2 - адрес начала массива
clr R0 ; R0 = 0
LOOP:
movb (R2)+, R3 ; R3 = *R2; R2++ записывает в R3 число, лежащее по адресу, хранимому в R2, этот адрес увеличивается
add R3, R0 ; очередное число прибавляется к текущей сумме
sob R1, LOOP ; if (--R1 != 0) goto LOOP;
halt
Суммирование массива, оканчивающегося нулем
. = 100 ; данные располагаются с 100 адреса
A: .BYTE 34, 12, -1, 66, 0 ; массив (А - константа, равна адресу 100), сумма = 133, так как все числа восьмеричные
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sum all data in the A array and store the summ into R0
; R0 - sum
; R2 - address
; R3 - (byte)A[R1]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.=1000 ; код располагается с 1000 адреса
mov #A, R2 ; R2 - адрес начала массива
clr R0 ; R0 = 0
LOOP:
movb (R2)+, R3 ; R3 = *R2; R2++ записывает в R3 число, лежащее по адресу, хранимому в R2, этот адрес увеличивается
beq END
add R3, R0 ; очередное число прибавляется к текущей сумме
br LOOP
END:
halt
Вывод одного символа * на печать (часть кода)
ocsr = 0177564 ; TTO command and status register for PDP-11
odat = 0177566 ; TTO data register
mov #'*, R0
putchar:
tstb @#ocsr ; test bit 7 in ocsr (it's sign bit!!!)
bpl putchar ; if ( bit 7 == 0 ) wait ... device is busy
movb R0,@#odat ; put char to the odat
Что делает этот код?
Дано двоичное дерево поиска. Что делает функция count?
int count ( struct Node * tree )
{
int sum = 0;
if ( tree == NULL ) return 0;
if ( tree -> left )
{
if (tree->left == NULL && tree->right !=NULL)
{
sum=sum-tree->val;
}
count( tree->left );
}
if ( tree -> right )
{
if (tree->right !=NULL)
{
sum = sum+tree->val;
}
count ( tree->right );
}
return sum;
}
Задача для Ласкиной
.=1000
main:
mov #main, sp
;lmov #-5, R1
;jsr pc, put21
mov #107075, R1
jsr pc, putbin
halt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; putbin - print 1 binary digit
; R1 - number
; corrupted:
; flags
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
putbin:
mov R1, -(sp)
mov R3, -(sp)
mov #20, R3
putbinloop:
jsr pc, put21
asl R1
sob R3, putbinloop
mov (sp)+, R3
mov (sp)+, R1
rts pc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; put21 - print 1 binary digit
; R1 - number
; corrupted:
; R0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
put21:
movb #'0, R0
tst R1
bpl put21end
incb R0
put21end:
jsr pc, putc
rts pc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; puts - print string up to 0
; R1 - string address
; corrupted:
; R0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
puts:
movb (R1)+, R0
beq ENDputs
jsr pc, putc
br puts
ENDputs:
rts pc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; putc - print 1 character from R0
; R0 - ascii code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ostat = 177564
odata = 177566
putc:
tstb @#ostat
bpl putc
movb R0, @#odata
rts pc
000000: .=1000
001000: main:
001000: mov #main, sp
012706
001000
001004: ;lmov #-5, R1
001004: ;jsr pc, put21
001004: mov #107075, R1
012701
107075
001010: jsr pc, putbin
004767
000002
001014: halt
000000
001016:
001016: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001016: ; putbin - print 1 binary digit
001016: ; R1 - number
001016: ; corrupted:
001016: ; flags
001016: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001016: putbin:
001016: mov R1, -(sp)
010146
001020: mov R3, -(sp)
010346
001022: mov #20, R3
012703
000020
001026: putbinloop:
001026: jsr pc, put21
004767
000012
001032: asl R1
006301
001034: sob R3, putbinloop
077304
001036:
001036:
001036: mov (sp)+, R3
012603
001040: mov (sp)+, R1
012601
001042: rts pc
000207
001044:
001044:
001044: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001044: ; put21 - print 1 binary digit
001044: ; R1 - number
001044: ; corrupted:
001044: ; R0
001044: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001044: put21:
001044: movb #'0, R0
112700
000060
001050: tst R1
005701
001052: bpl put21end
100001
001054: incb R0
105200
001056: put21end:
001056: jsr pc, putc
004767
000016
001062: rts pc
000207
001064:
001064:
001064: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001064: ; puts - print string up to 0
001064: ; R1 - string address
001064: ; corrupted:
001064: ; R0
001064: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001064: puts:
001064: movb (R1)+, R0
112100
001066: beq ENDputs
001403
001070: jsr pc, putc
004767
000004
001074: br puts
000773
001076: ENDputs:
001076: rts pc
000207
001100:
001100: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001100: ; putc - print 1 character from R0
001100: ; R0 - ascii code
001100: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
001100: ostat = 177564
001100: odata = 177566
001100: putc:
001100: tstb @#ostat
105737
177564
001104: bpl putc
100375
001106: movb R0, @#odata
110037
177566
001112: rts pc
000207
001114:
0200 004c
c6
15
00
02
c1
15
3d
8e
f7
09
02
00
00
00
66
10
e6
10
c3
15
10
00
f7
09
0a
00
c1
0c
c4
7e
83
15
81
15
87
00
c0
95
30
00
c1
0b
01
80
80
8a
f7
09
0e
00
87
00
40
94
03
03
f7
09
04
00
fb
01
87
00
df
8b
74
ff
fd
80
1f
90
76
ff
87
00