大家好,今天這節(jié)課中我們來深入的學(xué)習(xí)下乘法指令。乘法指令有兩種,一種是有符號整數(shù)乘法另一種是無符號整數(shù)乘法,今天我們來學(xué)習(xí)無符號整數(shù)乘法。
MUL是進(jìn)行無符號乘法的指令。MUL(無符號乘法)指令有三種格式:第一種是將8位的操作數(shù)于al相乘。第二種是將16位的操作數(shù)與ax相乘; 第三種是將32位的操作數(shù)與eax進(jìn)行相乘
乘數(shù)和被乘數(shù)大小必須相同,乘積的尺寸是乘數(shù)/被乘數(shù)大小的兩倍。 三種格式都既接受寄存器操作數(shù),也接受內(nèi)存操作數(shù)。但是不接受立即操作數(shù)(這點(diǎn)大家注意下)。
例如:
你想將al寄存器中的值乘上2,那么此時(shí)你需要將立即數(shù)2存放到一個(gè)寄存器中,然后通過mul指令相乘,或者將立即數(shù)放到一個(gè)內(nèi)存地址中,然后通過內(nèi)存單元的形式來進(jìn)行相乘。
舉例:
mov bl, 2
mul bl ;此刻將bl寄存器中的值乘上al寄存器中的值
指令中唯一的一個(gè)操作數(shù)是乘數(shù)。
也就是當(dāng)我們的乘數(shù)是8位的時(shí)候,則與al相乘,如果我們的乘數(shù)是16位則與ax相乘,如果我們的乘數(shù)是32位則與eax寄存器相乘。
那么下面我給出mul乘法的相關(guān)操作數(shù)的實(shí)例
被乘數(shù) 乘數(shù) 積
al 8位操作數(shù) ax
ax 16位操作數(shù) dx:ax
eax 32位操作數(shù) edx:eax
因?yàn)槿绻覀兊某藬?shù)是一個(gè)8位操作數(shù)的話,我們的結(jié)果存在在ax寄存器中。 如果是16位操作數(shù)的話,我們的結(jié)果存放在dx:ax中。如果dx不為0,則進(jìn)位標(biāo)志置位。
在執(zhí)行完mul指令后,我們一般要檢查下進(jìn)位標(biāo)志。因?yàn)槲覀冃枰莱朔e的高半部分是否可以安全的忽略。
例如:
mov al, 6h
mov bl, 10h
mul bl
此刻我們檢查進(jìn)位標(biāo)志cf = 0, 那么ah我們就可以將其忽略了,所以結(jié)果是60h。
那么我們再來舉一個(gè)例子:
例如:
mov ax, 6000
mov bx, 5000
mul bx
我們檢查進(jìn)位標(biāo)志,此時(shí)cf = 1。 那么我們的結(jié)果是dx:ax ,此時(shí)我們的dx = 1E00, ax = 0000 所以 最后我們的積 為 1E000000。
其實(shí)我們從乘積就可以算出來cf是否置位了。
1.接下來我們留個(gè)小作業(yè),不要用其他輔助工具來計(jì)算。自己口算下,執(zhí)行完后,積為多少?
mov eax, 00800000
mov ebx, 00200000
mul ebx
匯編基礎(chǔ)一日一學(xué)習(xí)31 IMUL
大家好,今天我們來學(xué)習(xí)下有符號整數(shù)的乘法運(yùn)算,IMUL指令。這個(gè)指令保留了乘積的符號位。IMUL指令,IA - 32指令集中有三種格式: 單操作數(shù)、雙操作數(shù)和三操作數(shù)。 在單操作數(shù)格式中,乘數(shù)和被乘數(shù)尺寸大小相同,乘積的大小是乘數(shù)/被乘數(shù)大小的兩倍。
單操作數(shù)格式: 單操作數(shù)格式把乘積存儲在累加器( ax, dx:ax, edx:eax)中。imul指令單操作數(shù)格式其實(shí)和我們昨天學(xué)習(xí)的mul指令格式基本一樣。
1.那么接下來我們來看下IMUL單操作數(shù)的格式:
imul 8位寄存器/8位內(nèi)存操作數(shù)
imul 16位寄存器/16位內(nèi)存操作數(shù)
imul 32位寄存器/32位內(nèi)存操作數(shù)
2.雙操作數(shù)數(shù)格式:
imul 16位寄存器/ 16位寄存器-16位內(nèi)存操作數(shù)
imul 16位寄存器/ 8位立即數(shù)
imul 16位寄存器/ 16位立即數(shù)
從上面我們可以看出 雙操作數(shù)格式中,乘積存儲在第一個(gè)操作數(shù)中,第一個(gè)操作數(shù)必須是寄存器,第二個(gè)操作數(shù)可以是寄存器、內(nèi)存操作數(shù)、或立即數(shù)。 上面雙操作數(shù)我是按照16位來給大家舉的一些例子。 它當(dāng)然還可以是32位的。
imul 32位寄存器/ 32位寄存器-32位內(nèi)存操作數(shù)
imul 32位寄存器/ 8位立即數(shù)
imul 32位寄存器/ 32位立即數(shù)
3.三操作數(shù)格式:
imul 16位寄存器/ 16位寄存器-16位內(nèi)存操作數(shù)/ 8位立即數(shù)
imul 16位寄存器/ 16位寄存器-16位內(nèi)存操作數(shù)/ 16位立即數(shù)
三操作數(shù)格式把乘積存儲在第一個(gè)操作數(shù),一個(gè)16位寄存器可以被一個(gè)8位或者16位的立即數(shù)乘。
imul 32位寄存器/ 32位寄存器 -32位內(nèi)存操作數(shù)/ 8位立即數(shù)
imul 32位寄存器/ 32位寄存器 -32位內(nèi)存操作數(shù)/ 32位立即數(shù)
如果有效位丟失,則溢出標(biāo)志和進(jìn)位標(biāo)志置位。 使用三操作數(shù)格式時(shí),一定要在執(zhí)行完imul操作后檢查相關(guān)操作位。
好,光看理論估計(jì)你很迷糊,那么我們就來看幾個(gè)實(shí)例:
1. 例如 mov al, -3
mov bl, 6
imul bl
此刻執(zhí)行的時(shí)候(-3*6)的結(jié)果存放到ax寄存器中,由于上面我說了,在執(zhí)行imul進(jìn)行有符號整數(shù)的乘法運(yùn)算時(shí),保留了乘積的符號位,也就是說乘積的高半部分是低半部分的符號擴(kuò)展。 符號擴(kuò)展是什么意思呢? 也就是說 如果我們的乘積是個(gè)負(fù)數(shù)則,高半部分都為1,如果乘積是個(gè)正數(shù)的話,高半部分都為0。很顯然我們(-3*6)是負(fù)數(shù),所以此時(shí)高半部分肯定是1,不信大家來計(jì)算下。
-3的16進(jìn)制表示形式是0FDh
好此刻我們將0FD轉(zhuǎn)換成補(bǔ)碼的形式,大家不知道還記得16進(jìn)制整數(shù)轉(zhuǎn)換補(bǔ)碼的方法嗎,用15減去各個(gè)進(jìn)制位,最終結(jié)果+1。
此刻
FDh
15 - F = 0
15 - D = 2
+ 1 = 03h
03*6h = 12h (注意10進(jìn)制18 = 16進(jìn)制12h)
此刻我們將取12h的補(bǔ)碼則為我們最后的乘積
12h
15 - 1 = E
15 - 2 = D
+ 1 = EEh
由于EEh的最高符號位是1,所以此時(shí)高半部分將擴(kuò)展為低半部分的符號位,所以此時(shí)高半部分為FF(也就是全是二進(jìn)制位1)。
最終的結(jié)果是FFEEh,此時(shí)由于已經(jīng)被擴(kuò)展了,所以此時(shí)的of = 0。(也就是說如果沒有擴(kuò)展的話,of = 1)。
2.再來看個(gè)例子
mov al, 3h
mov bl, 6h
imul bl
大家口算就可以算的出來,很顯然3*6=18, 16進(jìn)制 = 12h, 此時(shí)由于結(jié)果為正,因?yàn)榻Y(jié)果是12h,但是我們也并不能通過of 或者是 if來指示乘積的高半部分是否為0,也就是說我們的imul雖然能進(jìn)行無符號整數(shù)運(yùn)算,但是我們不能通過它影響的標(biāo)志位來進(jìn)行判斷。。
3. 再來看個(gè)例子
mov al, 48
mov bl, 3
imul bl
很顯然我們的結(jié)果為正數(shù),得到的積+144存放在ax中,由于ah不是al的符號擴(kuò)展,因?yàn)橐绯鰳?biāo)志位置位。 of =1
4. 那么接下來我再來舉個(gè)2操作數(shù)的。
mov ax, -30h
mov bx, 10h
imul ax, bx
那么-30 * 10 = -48 * 16 = -768
= -300h
然后我們求反碼
300
15 - 3 = C
15 - 0 = F
15 - 0 = F
+ 1 = D00
因?yàn)槲覀兊慕Y(jié)果是負(fù)數(shù),因?yàn)槲覀兊慕Y(jié)果是存在ax寄存器中的,而由于上面說了有符號數(shù)值的乘積是帶符號位擴(kuò)展的,高4位應(yīng)該全是1填充,所以最終結(jié)果為FD00h
5.接下來我們來個(gè)3位操作數(shù)的。
mov ax, -30h
imul bx, ax, 2h
這三個(gè)操作數(shù)的是將結(jié)果存放在第一個(gè)操作數(shù)中。
-30 * 2 = -60
這時(shí)候取反碼
15 - 6 = 9
15 - 0 = F
+1 = A0
乘積 = FFA0h,存放到bx中。
留個(gè)作業(yè):
1.
mov ax, -60h
imul bx, ax, 3
問:乘積多少?
匯編基礎(chǔ)一日一學(xué)習(xí)32 DIV
大家好,今天我們來學(xué)習(xí)下無符號整數(shù)的除法運(yùn)算指令,div(無符號)指令執(zhí)行8位、16位和32位無符號整數(shù)的除法運(yùn)算。指令中必須是唯一的一個(gè)寄存器或內(nèi)存操作數(shù)是除數(shù)。
div指令格式:
div 8位寄存器/8位內(nèi)存操作數(shù)
div 16位寄存器/16位內(nèi)存操作數(shù)
div 32位寄存器/32位內(nèi)存操作數(shù)
div指令格式和我們的mul基本可以算作是相反的。那么我們看下被除數(shù) 、 除數(shù)、商、余數(shù)之間的關(guān)系。
被除數(shù) 除數(shù) 商 余數(shù)
ax 8位寄存器/8位內(nèi)存操作數(shù) al ah
dx:ax 16位寄存器/16位內(nèi)存操作數(shù) ax dx
edx:eax 32位寄存器/32位內(nèi)存操作數(shù) eax edx
1.
舉個(gè)例子:
mov ax, 0060h
mov bl, 2
div bl ;al = 30h , ah = 00h
那么執(zhí)行完后, 商是30h ,余數(shù)是00h
2.
在舉個(gè)例子
執(zhí)行(6005h/100h),由于我們的出示是16位,所以被除數(shù)是放在dx:ax中的。 但是由于被除數(shù)是6005h,所以我們必須將dx清0.
xor dx, dx
mov ax, 6005h
mov bx, 100h
div bx
那么執(zhí)行后, 我們的ax = 0060h, dx = 0005h。 所以我們的商是60h, 余數(shù)是5h。
很簡單。
來個(gè)作業(yè):
1.寫出 執(zhí)行(9003h/50h)后的商和余數(shù),以及相關(guān)寄存器的值。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。