intmain(void){__asm{moval,0xffmovdl,0x01addal,dladcal,dl}return0;}還是用內(nèi)斂匯編的形式來說明。這里想AL給了一個(gè)" />

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

C++/Debug模式查看EFL(標(biāo)志寄存器)祥解

系統(tǒng) 3535 0

在比如使用匯編指令如:ADC, SBB等指令時(shí),我們?yōu)榱诵睦锬欠莺闷娓芯筒坏貌蝗チ私庀翭LAG寄存器(EFL)里面的東西。通過二進(jìn)制詳細(xì)的查看各標(biāo)志位的值。然后這些需要用到標(biāo)志寄存器的指令等就一目了然了。 - -

迫不及待寫了段測試代碼來看看其中的秘密:

#include <iostream>

int main( void )
{
__asm
{
mov al, 0xff
mov dl, 0x01

add al, dl
adc al, dl
}

return 0;

}

還是用內(nèi)斂匯編的形式來說明。 這里想AL給了一個(gè)0xff,為什么給AL為0xff是為了能夠進(jìn)位,我覺得這個(gè)數(shù)很方便,當(dāng)然你可以弄成其它數(shù)字,只要兩個(gè)數(shù)之和發(fā)生進(jìn)位就行(這里為了測試進(jìn)位的CF位)。DL我給了個(gè)0x01之和剛好進(jìn)位且可以測試奇偶和零值。

我們?cè)谏线吋t色的代碼出打下斷點(diǎn),然后運(yùn)行程序斷到這里,然后打開VC的寄存器窗口,我們可以看到各個(gè)寄存器的值。這里著重看EFL = ? 標(biāo)志寄存器的值。

這里查看標(biāo)志寄存器各標(biāo)志位的值有兩種查看方法:

第一: 把EFL的值轉(zhuǎn)成二進(jìn)制,通過二進(jìn)制位來查看個(gè)標(biāo)志位的值。

第二: 如果你的寄存器窗口里面沒有顯示標(biāo)志的話,可以在寄存器窗口里面點(diǎn)鼠標(biāo)右鍵,選擇“標(biāo)志”就會(huì)顯示個(gè)標(biāo)志位的值了,形如:

OV =? UP =? EI =? PL =? ZR =? AC =? PE =? CY =?

這里有個(gè)對(duì)照表:

asm

可以根據(jù)EFL的二進(jìn)制數(shù)據(jù)進(jìn)行位對(duì)照就知道各個(gè)標(biāo)志位的值了。

我們?cè)陂_始的斷點(diǎn)那里看到標(biāo)志的各值:

OV = 0 UP = 0 EI = 1 PL = 0 ZR = 0 AC = 0 PE = 0 CY = 0

這里EI = 1表示處于中斷狀態(tài) - -。。

再看EFL = 0x00000202(1000000010) 對(duì)號(hào)入座:

1 0 0 0 0 0 0 0 1 0

IF TF SF ZF AF PFCF

只有IF(EI|DI)為1, VC寄存器窗口里邊只用括號(hào)中的一種來表示。。。

好!看完了各標(biāo)志位,下面按F10執(zhí)行完ADD AL, DL這句。

看看各標(biāo)志位的值:OV = 0 UP = 0 EI = 1 PL = 0 ZR = 1 AC = 1 PE = 1 CY = 1

再來看看標(biāo)志寄存器的值: EFL = 0x00000257(1001010111)

1 0 0 1 0 1 0 1 1 1

IF TF SF ZF AF PF CF

這里IF表示已經(jīng)中斷, ZF表示目的操作數(shù)結(jié)果為零, AF表示(AL為一個(gè)字節(jié))相加進(jìn)行到一半(低4位)有沒有向另一半(高4位)進(jìn)位,也可以表示是否借位(減法)。 PF表示為偶數(shù), CF表示已經(jīng)發(fā)生進(jìn)位,也可以表示借位。

再按F10執(zhí)行完 ADC AL, DL 這句, ADC是帶進(jìn)位的加法, 結(jié)果為: AL = AL + DL + CF。

這時(shí)AL: 0 + 0x1 + 1 = 0x02。

標(biāo)志位值: OV = 0 UP = 0 EI = 1 PL = 0 ZR = 0 AC = 0 PE = 0 CY = 0 這里就不做解釋了吧 - -

這里特別說下:

DF:是控制標(biāo)志位為方向標(biāo)志,在串處理指令中控制處理信息的方向用。當(dāng)DF為1時(shí),每次操作后使變址寄存器SI和DI減小,這樣就使串處理從高地址向低地址方向處理。當(dāng)DF為0時(shí)相反。。

TF:當(dāng)TF被置為1時(shí),CPU進(jìn)入單步執(zhí)行方式,即每執(zhí)行一條指令,產(chǎn)生一個(gè)單步中斷請(qǐng)求。這種方式主要用于程序的調(diào)試。

在這里我們要獲得標(biāo)志寄存器的值的話有以下這些指令:

LAHF 標(biāo)志寄存器傳送,把標(biāo)志裝入AH.
SAHF 標(biāo)志寄存器傳送,把AH內(nèi)容裝入標(biāo)志寄存器.
PUSHF 標(biāo)志入棧.
POPF 標(biāo)志出棧.
PUSHD 32位標(biāo)志入棧.
POPD 32位標(biāo)志出棧.

在上邊的AF位讓我想到用ADC或者SBB來進(jìn)行進(jìn)位或借位的一個(gè)常用方法就是,我們可以在加/減兩個(gè)4字節(jié)的數(shù)據(jù)是可以高2字節(jié)、低2字節(jié)分別相加。通過ADC/SBB可以在計(jì)算高2字節(jié)想加/減時(shí)獲得CF值,用來進(jìn)行進(jìn)位或借位。

例如:

mov ax, low1

addax, low2

mov sumLow, ax

mov ax, high1

adc ax, high2

mov sumHigh, ax

這樣就實(shí)現(xiàn)了進(jìn)位, low1, low2分別表示第一個(gè)數(shù)和第二個(gè)數(shù)的低2字節(jié), high1, high2分別表示第一個(gè)數(shù)和第二個(gè)數(shù)的高2字節(jié)。 當(dāng) addax, low2 產(chǎn)生了進(jìn)位時(shí), CF = 1。 后邊在執(zhí)行高2字節(jié)相加時(shí)用ADC會(huì)去獲取CF的值。 sumHigh = high1 + high2 + CF。 最后得到的數(shù)就是高2字節(jié)之和(sumHigh)與低2字節(jié)之和(sumLow)的合并。形如:

DWORDvar = 0;

WORD sumHigh = 0;

WORD sumLow = 0;

C++:

var |= sumHigh;

var <<= 16;

var |= sumLow;

ASM:

movzx eax, word ptr[ sumHigh ]
shl eax, 10h
or eax, dword ptr[ sumLow ]
mov var, eax

這便實(shí)現(xiàn)了進(jìn)位。 借位的道理是一樣的, 這里就不闡述了。。 - -

終于寫完了~~累死了。。 有什么錯(cuò)誤希望大家?guī)臀壹m正 - -

C++/Debug模式查看EFL(標(biāo)志寄存器)祥解


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!?。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論