Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Лабораторная работа №2
- // Изучение арифметических команд
- // Выполнил студент группы ИСТд-22 Дадыкин П.В.
- Begin
- ASM
- // Сложение : Переполение
- // флаг O = 0 (Нет Переполнения)
- MOV AL, 126 // $7E -> AL (Положительное)
- MOV BL, 3 // $03 -> BL (Положительное)
- ADD AL, BL // $81 -> AL (Отрицательное)
- // флаг O = 1 (Переполнение)
- // Так как регистры однобайтовые, то могут содержать
- // только восемь разрядов, а результат данной
- // операции - 129, число, которое не помещается в эти
- // 8 разрядов, поэтому происходит переполнение регистра
- // НУЖНО ПРИБАВИТЬ ОДИН РАЗРЯД
- // и флаг O принимает значение 1
- PUSH 0 // Сброс флагов
- POPF
- // Сложение : Перенос
- // C = 0
- MOV AX, $01AE // $01AE -> AX
- MOV BX, $0152 // $0152 -> BX
- ADD AL, BL // $00 -> AL, C = 1 (Учтен Перенос В Старший Бит)
- ADC AH, BH // $03 -> AH (Сложение С Учетом Переноса)
- // AX = $0300
- // Результат сложения регистров AL и BL - $100,
- // поэтому единица идёт в переноc
- PUSH 0 // Сброс флагов
- POPF
- // Вычитание : Переполнение
- // O = 0 (Нет Переполнения)
- MOV AL, 130 // $82 -> AL (Положительное)
- MOV BL, 5 // $05 -> BL (Положительное)
- SUB AL, BL // $7D -> AL (Отрицательное)
- // флаг O = 1 (Переполнение)
- // Исходные данные - 9-разрядные числа, а
- // результат - 8 разрядное
- // один разряд нужно убрать
- // и флаг С принимает значение 1
- PUSH 0 // Сброс флагов
- POPF
- // Вычитание : Перенос
- // С = 0
- MOV AX, $FF00 // $FF00 -> AX
- MOV BX, $FE01 // $FE01 -> BX
- SUB AL, BL // $FF -> AL, C = 1 (Учтен перенос в старший бит)
- // A = 1 (Учтен заем)
- SBB AH, BH // $00 -> AH (Вычитание с учетом заема)
- // AX = $00FF
- // из $00 невозможно вычеть $01
- //
- PUSH 0 // Сброс флагов
- POPF
- MOV AH, $00 // $00 -> AH
- MOV AL, $00 // $00 -> AL
- MOV BH, $FF // $FF -> BH
- MOV BL, $FF // $FF -> BL
- DEC AH // С = 0 DEC не фиксирует переполнение
- SUB AL, $01 // C = 1 SUB фиксирует переполнение
- PUSH 0 // Сброс флагов
- POPF
- INC BH // C = 0 // INC не фиксирует переполнение
- ADD BL, $01 // C = 1 // ADD фиксирует переполнение
- MOV AL, $01 // $01 -> AL, S = 0 (Положительное)
- NEG AL // AL = $FF, S = 1 (Отрицательное)
- // Получение дополнительного кода
- PUSH 0 // Сброс флагов
- POPF
- MOV BH, $00 // $00 -> BH
- MOV BL, $00 // $00 -> BL
- MOV CX, $0001 // $0001 -> CX
- CMP BH, BL
- PUSHF
- POP EAX // AX -> 346 0000 0011 0100 0110
- // Z = 1 (Числа равны)
- CMP BX, CX
- PUSHF
- POP EAX // AX 0000 0011 1001 0111
- // Z = 0 (Числа не равны)
- PUSH 0 // Сброс флагов
- POPF
- MOV AL, 00000111B // $07 -> AL
- CBW // $0007 -> AX
- MOV AX, $0011 // $0011 -> AX (Положительное)
- NEG AX // AX = $FFEF (Отрицательное)
- CWD // DX = $FFFF (Расшиерние Бита Знака AX
- // До Величины Регистра DX)
- PUSH 0 // Сброс флагов
- POPF
- MOV AL, 6 // Первый Множитель $06 -> AX
- MOV DL, 7 // Второй Множитель $07 -> DL
- MUL DL // 42 = $2A -> AL
- MOV AX, 256 // Первый Множитель $0100 -> AX
- MOV DX, 2 // Второй Множитель $0002 -> DX
- MUL DX // 512 = $0200 -> AX
- MOV AL, -6 // Первый Множитель $FA -> AL
- MOV DL, 7 // Второй Множитель $07 -> DL
- IMUL DL // -42 = $D6 -> AL
- MOV AX, 256 // Первый Множитель $0100 -> AX
- MOV DX, -2 // Второй Множитель $FFFE -> DX
- IMUL DX // -512 = $FE00 -> AX
- PUSH 0 // Сброс флагов
- POPF
- MOV DL, 8 // Делитель $08 -> DL
- MOV AX, 42 // Делимое $002A -> AX
- DIV DL // Целая Часть 5 = $05 -> AL
- // Остаток 2 = $02 -> AH
- MOV ECX, $20003 // $00020003 -> ECX
- PUSH ECX
- MOV DX, [ESP+2] // Старшая Часть Делимого $0002 -> DX
- MOV AX, [ESP] // Младшая Часть Делимого $0003 -> AX
- MOV CX, 256 // Делитель $0100 -> DX
- DIV CX // Целая Часть 256 = $0200 -> AX
- // Остаток 3 = $0003 -> DX
- MOV DL, -8 // Делитель $F8 -> DL
- MOV AX, 42 // Делимое $002A -> AX
- IDIV DL // Целая Часть -5 = $FB -> AL
- // Остаток 2 = $02 -> AH
- MOV ECX, -65530 // $FFFF0006 -> ECX
- PUSH ECX
- MOV DX, [ESP+2] // Старшая Часть Делимого $FFFF -> DX
- MOV AX, [ESP] // Младшая Часть Делимого $0006 -> AX
- MOV CX, 256 // Делитель $0100 -> CX
- IDIV CX // Целая Часть -255 = $FF01 -> AX
- // Остаток - 250 = $FF06 -> DX
- END
- end.
Add Comment
Please, Sign In to add comment