Раздел «Язык Си».PDPtest:

Задачи на ассемблере 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

Attachment sort Action Size Date Who Comment
qqq.dat manage 188.0 K 17 May 2012 - 20:23 TatyanaDerbysheva Исходный файл данных