Раздел «Язык Си».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;
}

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