CSAPP 閱讀筆記 (9) 128位的乘除法和條件碼的匯編
CSAPP 閱讀筆記 (9) 128位的乘除法和條件碼的匯編
兩個(gè)64位的整數(shù)相乘需要128位來(lái)表示。x86-64提供將128位的數(shù)用八字表示(oct word)的表示方式。操作R需為%rax寄存器,imulq為有符號(hào)乘法,mulq為無(wú)符號(hào)乘法。無(wú)符號(hào)乘法與有符號(hào)乘法截取位數(shù)相同時(shí),結(jié)果位級(jí)行為相同。符號(hào)擴(kuò)展將%rax擴(kuò)展為128位。示例代碼將%rsi(x)移動(dòng)到%rax(被乘數(shù)),進(jìn)行128位的乘法,將結(jié)果的低8位移動(dòng)到內(nèi)存的(%rdi),高8位移動(dòng)到內(nèi)存的(%rdi)+8 byte。除法包括idivl(有符號(hào)數(shù)除法),128位的被除數(shù)(%rdx.%rax)除以一個(gè)除數(shù),結(jié)果存放在寄存器%rax中,余數(shù)存放在%rdx中。無(wú)符號(hào)除法使用divq指令,寄存器的%rdx會(huì)先設(shè)置為0。
導(dǎo)讀兩個(gè)64位的整數(shù)相乘需要128位來(lái)表示。x86-64提供將128位的數(shù)用八字表示(oct word)的表示方式。操作R需為%rax寄存器,imulq為有符號(hào)乘法,mulq為無(wú)符號(hào)乘法。無(wú)符號(hào)乘法與有符號(hào)乘法截取位數(shù)相同時(shí),結(jié)果位級(jí)行為相同。符號(hào)擴(kuò)展將%rax擴(kuò)展為128位。示例代碼將%rsi(x)移動(dòng)到%rax(被乘數(shù)),進(jìn)行128位的乘法,將結(jié)果的低8位移動(dòng)到內(nèi)存的(%rdi),高8位移動(dòng)到內(nèi)存的(%rdi)+8 byte。除法包括idivl(有符號(hào)數(shù)除法),128位的被除數(shù)(%rdx.%rax)除以一個(gè)除數(shù),結(jié)果存放在寄存器%rax中,余數(shù)存放在%rdx中。無(wú)符號(hào)除法使用divq指令,寄存器的%rdx會(huì)先設(shè)置為0。
![](https://img.51dongshi.com/20250108/wz/18377963252.jpg)
特殊的算術(shù)操作:兩個(gè)64位的整數(shù)相乘需要128位來(lái)表示。x86-64提供將128位的數(shù)用八字表示(oct word)的表示方式。操作R需為%rax寄存器,imulq為有符號(hào)乘法,mulq為無(wú)符號(hào)乘法。無(wú)符號(hào)乘法與有符號(hào)乘法截取位數(shù)相同時(shí),結(jié)果位級(jí)行為相同。符號(hào)擴(kuò)展將%rax擴(kuò)展為128位。示例代碼將%rsi(x)移動(dòng)到%rax(被乘數(shù)),進(jìn)行128位的乘法,將結(jié)果的低8位移動(dòng)到內(nèi)存的(%rdi),高8位移動(dòng)到內(nèi)存的(%rdi)+8 byte。除法包括idivl(有符號(hào)數(shù)除法),128位的被除數(shù)(%rdx, %rax)除以一個(gè)除數(shù),結(jié)果存放在寄存器%rax中,余數(shù)存放在%rdx中。無(wú)符號(hào)除法使用divq指令,寄存器的%rdx會(huì)先設(shè)置為0。控制包括直線代碼(指令順序執(zhí)行)和條件語(yǔ)句、循環(huán)語(yǔ)句、分支語(yǔ)句,根據(jù)條件判斷改變代碼執(zhí)行順序。機(jī)器實(shí)現(xiàn)使用jump指令改變指令執(zhí)行順序,可以指定控制到程序其他部分。條件碼寄存器(Condition code Register)包括CF(進(jìn)位標(biāo)志)、ZF(零標(biāo)志)、SF(符號(hào)標(biāo)志)、OF(溢出標(biāo)志)。假設(shè)t=a+b(a、b為整型),則CF和OF會(huì)設(shè)置為0,移位操作會(huì)設(shè)置CF和OF為0,INC和DEC會(huì)設(shè)置OF和ZF(溢出:Overflow Flag和零標(biāo)志Zero Flag)。CMP指令和TEST指令設(shè)置條件碼,不改變寄存器,如果兩個(gè)操作數(shù)相同,則將零標(biāo)志位設(shè)置為1,其他標(biāo)志決定大小關(guān)系。testq %rax, %rax檢查%rax是否為零或正數(shù)。通過(guò)testq %al %bl判斷%al的%bl掩碼位置是否為1。訪問(wèn)條件碼的步驟包括使用SET指令設(shè)置字節(jié)或低位單字節(jié)寄存器(如%al和%bl),或字節(jié)內(nèi)存位置,setl設(shè)置小于,seb設(shè)置低于。典型指令序列用于表示有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的比較。補(bǔ)充:setg和setle是同一條機(jī)器指令,表示大于和不大于(就是小于等于),用于有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的比較。比較溢出和運(yùn)算結(jié)果,使用CF、ZF、SF、OF表示判斷結(jié)果。跳轉(zhuǎn)指令(jmp)導(dǎo)致執(zhí)行切換到程序中的一個(gè)新位置,每次跳轉(zhuǎn)用label指明目標(biāo)。jmp指令直接跳轉(zhuǎn),目標(biāo)是部分編碼的指令,可以間接跳轉(zhuǎn),目標(biāo)是寄存器或內(nèi)存位置。跳轉(zhuǎn)指令的編碼由匯編器和鏈接器產(chǎn)生,最常用的是地址偏移量或絕對(duì)地址。示例匯編代碼和反匯編代碼用于解釋跳轉(zhuǎn)指令的目標(biāo)編碼。習(xí)題涉及根據(jù)cmp和set的后綴判斷數(shù)據(jù)長(zhǎng)度和類型,例如使用cmpl和setl判斷有符號(hào)數(shù)的long int大小的比較,cmpw和setge判斷有符號(hào)數(shù)的word大小的比較,cmpb和setbe判斷無(wú)符號(hào)數(shù)的byte大小的比較,cmpq和setne判斷64位quad大小的不等號(hào)比較。
CSAPP 閱讀筆記 (9) 128位的乘除法和條件碼的匯編
兩個(gè)64位的整數(shù)相乘需要128位來(lái)表示。x86-64提供將128位的數(shù)用八字表示(oct word)的表示方式。操作R需為%rax寄存器,imulq為有符號(hào)乘法,mulq為無(wú)符號(hào)乘法。無(wú)符號(hào)乘法與有符號(hào)乘法截取位數(shù)相同時(shí),結(jié)果位級(jí)行為相同。符號(hào)擴(kuò)展將%rax擴(kuò)展為128位。示例代碼將%rsi(x)移動(dòng)到%rax(被乘數(shù)),進(jìn)行128位的乘法,將結(jié)果的低8位移動(dòng)到內(nèi)存的(%rdi),高8位移動(dòng)到內(nèi)存的(%rdi)+8 byte。除法包括idivl(有符號(hào)數(shù)除法),128位的被除數(shù)(%rdx.%rax)除以一個(gè)除數(shù),結(jié)果存放在寄存器%rax中,余數(shù)存放在%rdx中。無(wú)符號(hào)除法使用divq指令,寄存器的%rdx會(huì)先設(shè)置為0。
為你推薦