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。實體地址表示方法 位址加法器,...