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