乘法指令
- mul 源操作數(shù)
源操作數(shù)可以是字節(jié)驶社,字或雙字掉盅,而且可以在存儲器或寄存器中不能是立即數(shù)
乘積結果以兩倍操作數(shù)的空間存放
源操作數(shù)
字節(jié) ax = al × 源操作數(shù)
字 dx:ax = ax × 源操作數(shù)
雙字 edx = eax × 源操作數(shù)
注意:
如果乘積結果高位部分不為零尽楔,那么進位標志位CF和溢出標志位OF將置為1
imul 源操作數(shù)
可以理解為帶符號的mul指令员咽。和mul指令類似丰介,不過是有符號數(shù)的乘法指令
用法與mul指令相同imul 寄存器呀打,源操作數(shù)
源操作數(shù)可以在寄存器中榜贴,存儲器中豌研,或者是立即數(shù)
另一個乘數(shù)在寄存器中,它也作為目的地址imul 寄存器唬党,源操作數(shù)鹃共,立即數(shù)
第一個操作數(shù)-寄存器僅用來存放乘積。
第二個操作數(shù)可能在寄存器中或者在存儲器中驶拱。
第三個操作數(shù)為立即數(shù)霜浴。
第一個操作數(shù)和第二個操作數(shù)長度相同,都是16位或都是32位蓝纲。如果乘積和目的寄存器長度一致阴孟,那么CF和OF清零,否則置1.
除法指令
- div 源操作數(shù)
無符號數(shù)除法指令 - idiv 源操作數(shù)
有符號數(shù)除法指令
源操作數(shù)就是除數(shù)税迷,除數(shù)可以存放在寄存器或存儲器中永丝,但不能是立即數(shù)。idiv和div使用隱式的被除數(shù)(該操作數(shù)被除)箭养。
單操作數(shù)除法指令
被除數(shù)長度默認是源操作數(shù)長度的兩倍慕嚷。例如,若源操作數(shù)是一個字長露懒,則雙字長度的被除數(shù)高16位存放在DX寄存器中闯冷,低16位存放在AX寄存器中
源操作數(shù)(除數(shù)) | 第二個操作數(shù)(被除數(shù)) | 商 | 余數(shù) |
---|---|---|---|
字節(jié) | AX | AL | AH |
字 | DX:AX | AX | DX |
雙字 | EDX:EAX | EAX | EDX |
除法指令的兩種常見錯誤
- 除數(shù)為零
- 商太大而不能存入單倍長的目的地址中(這時就要用到位數(shù)擴展)
位數(shù)擴展(cdw,cwd,cdq用于有符號的除法指令)
- 正的被除數(shù)高位必須用0擴展,負的被除數(shù)高位必須用1擴展
指令 | 含義 |
---|---|
cbw(字節(jié)轉換為字) | 將AL寄存器中的二進制補碼數(shù)擴展位AX中的字長 |
cwd(字轉換為雙字) | 將AX寄存器中的二進制補碼數(shù)擴展為DX和AX中的雙字 |
cdq(將雙字轉換為四字) | EAX -> EDX:EAX |
cwde(字 to 雙字) | AX -> EAX(不和除法指令配套使用) |
movzx 寄存器懈词,源操作數(shù) | 用0來擴展源操作數(shù) |
movsx 寄存器蛇耀,源操作數(shù) | 復制符號位來擴展源操作數(shù) |
說明:
- movzx和movsx指令源操作數(shù)可以存放在寄存器或存儲器,源操作數(shù)可以是8位坎弯,16位纺涤,目的地址寄存器可以是16位或32位