16位彙編 neg sbb算術運算代替邏輯跳轉

2021-05-23 01:39:28 字數 1110 閱讀 9714

舉例**如下

這句**的關鍵點是neg 和sbb

相關知識點

neg(求補指令)

neg指令除了對運算元作符號取反外 會根據運算元來修改標誌位cf

當運算元為0是cf修改為0  否則cf修改為1

sbb( 帶借位減法指令)

sbb reg,imm/reg/mem ;reg←(reg-(imm/reg/mem)-cf)

sbb mem,imm/reg ;mem←mem-imm/reg-cf

mov ax,1    ;

sub ax,1

neg ax

sbb ax,ax

mov bx,4

lea bx,[bx-4*ax]

mov ax,1      ;ax = 1

sub ax,1      ;ax = 0

neg ax        ;ax = 0 cf = 0

sbb ax,ax     ;cf = 0 ax = 0

mov bx,4      ;bx = 4

lea bx,[bx-4*ax] ;bx = 4

最後bx = 4

mov ax,2      ;ax = 2

sub ax,1      ;ax = 2

neg ax        ;ax = 1 cf = 1

sbb ax,ax     ;cf = 1 ax = -1

mov bx,4      ;bx = 4

lea bx,[bx-4*ax] ;bx = 8

最後bx = 8

並且發現最後結果只有兩種可能4或8

"模板"   一下偽**

int  nflag

mov ax,nflag 

sub ax,1   

neg ax      

sbb ax,ax 

mov bx,4   

lea bx,[bx-4*ax]

這句相當於就是

if(nflag = 1)

bx = 4

else

bx = 8

這樣使用算術運算代替了邏輯運算 大大減少

了cpu運算週期

達到程式優化效果

16位彙編筆記

1 子函式中進行現場保護時,不能把返回值所存放的暫存器 絕對不可以 入棧,只是被訪問而沒有被修改的暫存器也不需要入棧。子函式的引數盡量入棧,因為如果後面的子函式再次使用這些引數時,需要確保引數沒有變動 2 開機cpu加電後,初始化cs 0ffffh,ip 0。ffffh 0處有一條跳轉指令,跳轉至b...

16位彙編 定址方式

1 8086 8088的基本定址方式可分為哪三類?它們說明了什麼?儲存器 立即 暫存器 3中定址方式 2 儲存器定址方式可分為哪幾種?何為儲存單元的有效位址?3 請說明如下指令中源運算元的定址方式,並作相互比較 mov bx,1234h mov bx,1234 mov dx,bx mov dx,bx...

Python 運算(常用的算術運算 位運算)

運算子含義 例項 假設變數 a 10,b 20 除 x除以y b a 輸出結果 2 取模 返回除法的餘數 b a 輸出結果 0 冪 返回x的y次冪 a b 為10的20次方,輸出結果 取整除 返回商的整數部分 向下取整 9 2 4 運算子含義 按位與操作,只有 1 1 為1,其他情況為0。可用於進製...