abc Asembler - elektronski priručnik
X dio Aritmetičke instrukcije

Instrukcije MUL/IMUL

Instrukcije MUL/IMUL

Postoje 2 instrukcije za množenje binarnih podataka. MUL (Multiply) instrukcija radi sa neoznačenim (unsigned) podacima, a IMUL (Integer Multiply) radi sa označenim podacima. Obe instrukcije imaju efekta na Carry i Overflow flag.

Sintaksa
Sintaksa za MUL/IMUL instrukcije je sljedeća:

MUL/IMUL multiplier

Množenik (multiplikand) u oba slučaja će biti u akumulatoru, zavisno od veličine multiplikanda, a multiplikator (množitelj) i generisani proizvod je takođe spremljen u 2 registra zavisno od veličine operanda. Sljedeći odjeljak objašnjava MUL instrukcije u 3 različita slučaja:

SN

Scenario

1

Kada se množe 2 bajta -
Multiplikand je u AL registru, a multiplikator je bajt u memoriji ili u drugom registru. Proizvod je u AX. 8 bitova višeg reda proizvoda je spremljeno u AH, a 8 bitova nižeg reda je spremljeno u AL.

2

Kada se množe dvije 1-word vrijednosti -
Multiplikand mora biti u AX registru, a multiplikator je word u memoriji ili drugom registru. Na primjer, za instrukciju poput MUL DX, moramo spremiti multiplikator u DX, a multiplikand u AX.
Rezultantni proizvod je doubleword, koji će trebati 2 registra. Dio višeg reda (krajnji lijevi) se sprema u DX, a dio nižeg reda (krajnji desni) se sprema u AX.

3

Kada se množe 2 doubleword vrijednosti -
Kada se množe 2 doubleword vrijednosti, multiplikand mora biti u EAX, a multiplikator je doubleword vrijednost spremljena u memoriji ili u drugom registru. Generisani proizvod je spremljen u EDX:EAX registrima, tj., 32 bita višeg reda se spremaju u EDX registar, a nižeredni 32-bitovi su spremljeni u EAX registar.

Primjer

MOV  AL, 10
MOV  DL, 25
MUL   DL
...
MOV  DL, 0FFH 	; DL= -1
MOV  AL, 0BEH 	; AL = -66
IMUL  DL

Primjer
Sljedeći primjer množi 3 sa 2, i prikazuje rezultat:

section    .text
      global _start 	;must be declared for using gcc
_start: 			;tell linker entry point

        mov  al, '3'
        sub   al, '0'
        mov  bl, '2'
        sub   bl, '0'
        mul   bl
        add   al, '0'
        mov  [res], al
        mov  ecx, msg
        mov  edx, len
        mov  ebx, 1 	;file descriptor (stdout)
        mov  eax, 4 	;system call number (sys_write)
        int     0x80 		;call kernel
        mov  ecx, res
        mov  edx, 1
        mov  ebx, 1 	;file descriptor (stdout)
        mov  eax, 4 	;system call number (sys_write)
        int     0x80 		;call kernel
        mov  eax, 1 	;system call number (sys_exit)
        int     0x80 		;call kernel

section   .data
msg  db "Rezultat je:", 0xA, 0xD
len    equ $- msg
segment  .bss
res resb 1

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:

Rezultat je:
6

Instrukcija ADD i SUB    <    Index    >    Instrukcije DIV/IDIV