32位組合語言學習筆記 5 特殊的算術操作

2021-06-27 04:31:26 字數 2557 閱讀 5485



imull s

,edx:eax = eax * s

(edx

表示64

位的高32

位,eax

表示低32

位),有符號

64位乘法。

mull s

,edx:eax = eax * s

,無符號

64位乘法。

cltd

,eax

暫存器中的數,按照符號位擴充套件到

edx,轉為

8個位元組。

idivl s

,edx =edx:eax mod s

,eax =edx:eax / s

,有符號除法。

divl s

,edx =edx:eax mod s

,eax =edx:eax / s

,無符號除法。

一對暫存器

edx:eax

組成64

位的四字。

示例:long long mul_64(long long a, long long b)

gcc -o1 -s -m32 mul_64.c

mul_64:

pushl

%ebp

movl

%esp, %ebp

subl

$12, %esp //

棧指標下移

12個位元組。

movl

%ebx, (%esp) //

儲存ebx

。movl

%esi, 4(%esp) //

儲存esi

。movl

%edi, 8(%esp) //

儲存edi

。movl

8(%ebp), %ecx

movl

12(%ebp), %ebx//ebx:ecx

用於儲存

64位整數a。

movl

16(%ebp), %eax

movl

20(%ebp), %edx//edx:eax

用於儲存

64位整數b。

movl

%edx, %esi //b

的高位32

位裝入esi

。imull

%ecx, %esi //a

的低32位與b

的高32

位相乘,結果放到

esi中。

movl

%ebx, %edi //a

的高位32

位裝入edi

。imull

%eax, %edi //a

的高32位與b

的低32

位相乘,結果放到

edi中。

addl

%edi, %esi //

兩個中間結果相加,放到

esi中。

mull

%ecx //a

的低32位與b

的低32

位相乘,結果放到

edx:eax

中。addl

%edx, %esi //

把上條指令計算結果的高

32位,與

edi儲存的中間結果相加。

movl

%esi, %edx//

把計算結果儲存回

edx中。

movl

(%esp), %ebx //

恢復ebx

值movl

4(%esp), %esi //

恢復esi

值movl

8(%esp), %edi //

恢復edi

值movl

%ebp, %esp

popl

%ebp

ret對演算法的解釋:

a = (a1* 2^32 + a2)

b = (b1*2^32 + b2)

假設a1,b1

都不為0

,兩個高

32位乘必然大於

2^64

,會溢位,所以忽略。

因此乘法只計算

a1*b2 + b1*a2

,如果這個結果溢位,也不用關心。

如果沒有溢位,那麼結果應該儲存在高

32位,與

a2*b2

結果求和。

int div_32(long a, long b)

gcc -o1 -s -m32 div.c

div_32:

pushl

%ebp

movl

%esp, %ebp

movl

8(%ebp), %edx //把a

裝入到edx

movl

%edx, %eax //複製a

到eax

sarl

$31, %edx //

算術右移

31位,相當於

edx都用符號位填充了。

idivl

12(%ebp) //a/b = eax a modb = edx

popl

%ebp

ret

32位組合語言學習筆記 4 移位操作

sal k,d d d k 左移。shl,與 sal相同。sar k,d d d k 算術右移。shr k,d d d l k 邏輯右移。算術右移是指左邊空出來的位填符號位。邏輯右移是指左邊空出來的位填0。示例 shift.c int shift left2 rightn int x,int n g...

32位組合語言學習筆記 6 設定條件碼

條件碼儲存在條件碼暫存器中,用於描述算術和最近邏輯操作的屬性。最常用的條件碼有 cf 進製標誌。zf 零標誌。sf 符號標誌。of 溢位標誌。算術和邏輯操作指令都會修改條件碼的值,但是 leal 指令不會修改條件碼的值。此外,cmp 指令和test 指令也會修改條件碼。cmp s2,s1 將s1 s...

組合語言學習筆記

學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...