MOV AX, Mat AX = 0x0A2A (...00101010)
AND AL,7Ch AX = 0x0A28 (...00101000)
OR AL,83h AX = 0x0AAB (...10101011)
XOR BL,BL BL = 0x00
SUB BL,2 BL = 0xFE
IMUL BL AX = 0xFFAB * 0xFFFE = 0x00AA
MOV Ris5,AX Ris5 = 0x00AA
когда вы объединяете два N-битных числа, младшие N-биты не заботятся о знаковых и беззнаковых знаках, но когда вы дополняете числа, вы попадаете в умноженные со знаками и беззнаковыми команды, как вы увидите в некоторых наборах команд. Чтобы не потерять точность, нужно получить 2 * N числа битов, математика начальной школы:
00000000aaaaaaaa
* 00000000bbbbbbbb
=====================
AAAAAAAAAAaaaaaa
* BBBBBBBBBBbbbbbb
====================
подписано против неподписанного с большой буквы, представляющей расширение знака
0xAB = 171 без знака = -85 со знаком
0xFE = 254 без знака = -2 со знаком
умножение без знака 171 * 254 = 43434 = 0xA9AA
умноженное со знаком -85 * -2 = 170 = 0x00AA
младший байт такой же, как и 8-битные операнды, и расширение знака не вступает в игру:
bbbbbbbb *a[0]
bbbbbbbb *a[1]
bbbbbbbb *a[2]
bbbbbbbb *a[3]
bbbbbbbb *a[4]
bbbbbbbb *a[5]
bbbbbbbb *a[6]
+ bbbbbbbb *a[7]
==================
cyyyyyyyxxxxxxxx
Если вы посмотрите столбцы, расширение х не будет затронуто расширением знака, поэтому одинаково для неподписанного и подписанного. На биты y влияют так же как на выполнение msbit c, который составляет 16-й бит результата.
Теперь инструмент не жалуется на этот синтаксис:
Mat = 0A2A(hexadecimal)
без h в конце или 0x или $ спереди, которое выглядит как восьмеричное, но А вызывает ошибку, если восьмеричное (или десятичное). Предполагая, что вы начинаете с 0x0A2A, я думаю, что вы хорошо понимаете.