MOVZX
MOVSX
Movsx EAX, DL
Movzx EAX, DL
1011 0010
0
EAX
00
00
00
DL
B2
EBX
FF
Movzx EBX, AH
0
EBX
00
Ex.
00
MOV
MOV
MOVZX
ADD
00
0011 0010
DL
1011 0010
S
FF
FF
Movsx EAX, DL
AH
B2
EBX
00
00
Ex.
EBX, OFFSET BUFF
AH, Byte ptr [ECX]
EAX, AH
EBX, EAX
MUL
Multiplica (sem sinal)
DL
0011 0010
S
00
MOV
MOV
MOVSX
ADD
EBX, OFFSET BUFF
AH, -35
EAX, AH
EBX, EAX
IMUL
Multiplica (com sinal)
Reg/Mem16
Reg/Mem8
X
AL
AH
AL
X
DH
DL
AH
AL
AH
AL
Reg/Mem32
EAX
X
DH
EDX
DL
AH
AL
AH
AL
EAX
1
DIV
Divide (sem sinal)
AH
IDIV
Divide (com sinal)
AL
Reg/Mem8
AH
AL
Reg/Mem16
DH
DL
AH
AL
DH
DL
AH
EDX
AL
EAX
Reg/Mem32
EDX
EAX
EDX
EAX
A rotina HEX_BCD converte o conteúdo do registo AX, em código hexadecimal,
para código BCD. O resultado fica guardado no registo EBX.
HEX_BCD:
CICLO:
MOV EDI, OFFSET Res_Temp
MOV BX, 10D
MOV CL, O5
MOV DX, 00H
DIV BX ; AX=Quociente e DX=resto
MOV [EDI], DL; DX=resto e < 10D (1 byte)
INC EDI
DEC CL
JNZ CICLO
CALL EMPACOTA
RET
2
DX
AX
BX
DX
AX
65535
BX = 10
....
10
6553
5
....
3
DX
AX
10
655
....
5
BX
10
65
....
5
DX
DX
03
05
05
06
1
2
3
4
EDI = OFFSET RES_TEMP
5
AX
BX
DX
AX
Empacotar
00
06
00
OR
05
05
50
00
06
OR
03
55
OR
03
05
05
06
EDI = OFFSET RES_TEMP
; EDI contem o endereço do 1º byte do buffer
; ESI contem o endereço do buffer de destino
05
30
50
10
0
05
05
6
6
AX
Dx = 0
10
30
36
; EDI contem o endereço do byte
EMPACOTA: PUSH EAX
PUSH ECX
PUSH ESI
MOV AH, 03
REPETE:
MOV AL, [EDI]
INC EDI
CALL TROCA
OR AL, [EDI]
MOV [ESI], AL
INC ESI
INC EDI
DEC AH
JNZ REPETE
POP ESI
POP ECX
POP EAX
RET
TROCA: MOV CL, 04
ROL BYTE PTR [EDI], CL
RET
3
CBW
CWD
CDQ
IF AL <0
THEN AH = FF
ELSE AH = 00
IF AX <0
THEN DX = FFFF
ELSE DX = 00
IF EAX <0
THEN EDX = FFFFFFFF
ELSE AH = 00
NOT
NEG
XCHG
Exchange
MOV AH, 03
NOT AH
0000 0011
MOV AH, 03
NEG AH
MOV EAX, 2300
MOV EDI, 0154
XCHG EAX, EDI
0000 0011
EAX= 0154
EDI = 2300
NOT AH
NEG AH
1111 1100
1111 1101
Complemento para 1
NOT AH
INC AH
EAX
EDI
Complemento para 2
4