Guest User

Untitled

a guest
Feb 19th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.01 KB | None | 0 0
  1. //  Лабораторная работа №2
  2. //  Изучение арифметических команд
  3. //  Выполнил студент группы ИСТд-22 Дадыкин П.В.
  4.  
  5. Begin
  6.  
  7.   ASM
  8.     //  Сложение : Переполение
  9.                        // флаг O = 0    (Нет Переполнения)
  10.     MOV AL, 126        // $7E -> AL (Положительное)
  11.     MOV BL, 3          // $03 -> BL (Положительное)
  12.     ADD AL, BL         // $81 -> AL (Отрицательное)
  13.                        // флаг O = 1    (Переполнение)
  14.  
  15.                        // Так как регистры однобайтовые, то могут содержать
  16.                        // только восемь разрядов, а результат данной
  17.                        // операции - 129, число, которое не помещается в эти
  18.                        // 8 разрядов, поэтому происходит переполнение регистра
  19.                        // НУЖНО ПРИБАВИТЬ ОДИН РАЗРЯД
  20.                        // и флаг O принимает значение 1
  21.  
  22.  
  23.     PUSH 0             // Сброс флагов
  24.     POPF
  25.  
  26.     //  Сложение : Перенос
  27.                        // C = 0
  28.     MOV AX, $01AE      // $01AE -> AX
  29.     MOV BX, $0152      // $0152 -> BX
  30.     ADD AL, BL         // $00 -> AL, C = 1 (Учтен Перенос В Старший Бит)
  31.     ADC AH, BH         // $03 -> AH   (Сложение С Учетом Переноса)
  32.                        // AX = $0300
  33.  
  34.                        // Результат сложения регистров AL и BL - $100,
  35.                        // поэтому единица идёт в переноc
  36.  
  37.  
  38.     PUSH 0             // Сброс флагов
  39.     POPF
  40.  
  41.     //  Вычитание : Переполнение
  42.                        // O = 0   (Нет Переполнения)
  43.     MOV AL, 130        // $82 -> AL (Положительное)
  44.     MOV BL, 5          // $05 -> BL (Положительное)
  45.     SUB AL, BL         // $7D -> AL (Отрицательное)
  46.                        // флаг O = 1 (Переполнение)
  47.  
  48.                        // Исходные данные - 9-разрядные числа, а
  49.                        // результат - 8 разрядное
  50.                        // один разряд нужно убрать
  51.                        // и флаг С принимает значение 1
  52.  
  53.  
  54.     PUSH 0             // Сброс флагов
  55.     POPF
  56.  
  57.     //  Вычитание : Перенос
  58.                        // С = 0
  59.     MOV AX, $FF00      // $FF00 -> AX
  60.     MOV BX, $FE01      // $FE01 -> BX
  61.     SUB AL, BL         // $FF -> AL, C = 1 (Учтен перенос в старший бит)
  62.                        // A = 1 (Учтен заем)
  63.     SBB AH, BH         // $00 -> AH (Вычитание с учетом заема)
  64.                        // AX = $00FF
  65.  
  66.                        // из $00 невозможно вычеть $01
  67.                        //
  68.  
  69.     PUSH 0             // Сброс флагов
  70.     POPF
  71.  
  72.     MOV AH, $00        // $00 -> AH
  73.     MOV AL, $00        // $00 -> AL
  74.     MOV BH, $FF        // $FF -> BH
  75.     MOV BL, $FF        // $FF -> BL
  76.     DEC AH             // С = 0  DEC не фиксирует переполнение
  77.     SUB AL, $01        // C = 1  SUB фиксирует переполнение
  78.  
  79.     PUSH 0             // Сброс флагов
  80.     POPF
  81.  
  82.     INC BH             // C = 0 //  INC не фиксирует переполнение
  83.     ADD BL, $01        // C = 1 //  ADD фиксирует переполнение
  84.  
  85.  
  86.     MOV AL, $01        // $01 -> AL, S = 0 (Положительное)
  87.     NEG AL             // AL = $FF,  S = 1 (Отрицательное)
  88.                        // Получение дополнительного кода
  89.  
  90.  
  91.     PUSH 0             // Сброс флагов
  92.     POPF
  93.  
  94.     MOV BH, $00        // $00 -> BH
  95.     MOV BL, $00        // $00 -> BL
  96.     MOV CX, $0001      // $0001 -> CX
  97.     CMP BH, BL
  98.     PUSHF
  99.     POP EAX            // AX -> 346 0000 0011 0100 0110
  100.                        // Z = 1 (Числа равны)
  101.  
  102.     CMP BX, CX
  103.     PUSHF
  104.     POP EAX            // AX 0000 0011 1001 0111
  105.                        // Z = 0 (Числа не равны)
  106.  
  107.     PUSH 0             // Сброс флагов
  108.     POPF
  109.  
  110.  
  111.     MOV AL, 00000111B  // $07 -> AL
  112.     CBW                // $0007 -> AX
  113.     MOV AX, $0011      // $0011 -> AX (Положительное)
  114.     NEG AX             // AX = $FFEF  (Отрицательное)
  115.     CWD                // DX = $FFFF  (Расшиерние Бита Знака AX
  116.                        // До Величины Регистра DX)
  117.  
  118.     PUSH 0             // Сброс флагов
  119.     POPF
  120.  
  121.     MOV AL, 6          // Первый Множитель $06 -> AX
  122.     MOV DL, 7          // Второй Множитель $07 -> DL
  123.     MUL DL             // 42 = $2A -> AL
  124.     MOV AX, 256        // Первый Множитель $0100 -> AX
  125.     MOV DX, 2          // Второй Множитель $0002 -> DX
  126.     MUL DX             // 512 = $0200 -> AX
  127.  
  128.  
  129.     MOV AL, -6         // Первый Множитель $FA -> AL
  130.     MOV DL, 7          // Второй Множитель $07 -> DL
  131.     IMUL DL            // -42 = $D6 -> AL
  132.     MOV AX, 256        // Первый Множитель $0100 -> AX
  133.     MOV DX, -2         // Второй Множитель $FFFE -> DX
  134.     IMUL DX            // -512 = $FE00 -> AX
  135.  
  136.     PUSH 0             // Сброс флагов
  137.     POPF
  138.  
  139.     MOV DL, 8          // Делитель $08 -> DL
  140.     MOV AX, 42         // Делимое  $002A -> AX
  141.     DIV DL             // Целая Часть 5 = $05 -> AL
  142.                        // Остаток     2 = $02 -> AH
  143.  
  144.     MOV ECX, $20003     // $00020003 -> ECX
  145.     PUSH ECX
  146.     MOV DX, [ESP+2]    // Старшая Часть Делимого $0002 -> DX
  147.     MOV AX, [ESP]      // Младшая Часть Делимого $0003 -> AX
  148.     MOV CX, 256        // Делитель $0100 -> DX
  149.     DIV CX             // Целая Часть  256 = $0200 -> AX
  150.                        // Остаток        3 = $0003 -> DX
  151.  
  152.     MOV DL, -8         // Делитель $F8 -> DL
  153.     MOV AX, 42         // Делимое  $002A -> AX
  154.     IDIV DL            // Целая Часть -5 = $FB -> AL
  155.                        // Остаток      2 = $02 -> AH
  156.  
  157.     MOV ECX, -65530    // $FFFF0006 -> ECX
  158.     PUSH ECX
  159.     MOV DX, [ESP+2]    // Старшая Часть Делимого $FFFF -> DX
  160.     MOV AX, [ESP]      // Младшая Часть Делимого $0006 -> AX
  161.     MOV CX, 256        // Делитель $0100 -> CX
  162.     IDIV CX            // Целая Часть -255 = $FF01 -> AX
  163.                        // Остаток    - 250 = $FF06 -> DX
  164.   END
  165. end.
Add Comment
Please, Sign In to add comment