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

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2940 0

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

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

#include <iostream>

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

add al, dl
adc al, dl
}

return 0;

}

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

我們在上邊紅色的代碼出打下斷點,然后運行程序斷到這里,然后打開VC的寄存器窗口,我們可以看到各個寄存器的值。這里著重看EFL = ? 標志寄存器的值。

這里查看標志寄存器各標志位的值有兩種查看方法:

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

第二: 如果你的寄存器窗口里面沒有顯示標志的話,可以在寄存器窗口里面點鼠標右鍵,選擇“標志”就會顯示個標志位的值了,形如:

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

這里有個對照表:

asm

可以根據(jù)EFL的二進制數(shù)據(jù)進行位對照就知道各個標志位的值了。

我們在開始的斷點那里看到標志的各值:

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

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

再看EFL = 0x00000202(1000000010) 對號入座:

1 0 0 0 0 0 0 0 1 0

IF TF SF ZF AF PFCF

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

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

看看各標志位的值:OV = 0 UP = 0 EI = 1 PL = 0 ZR = 1 AC = 1 PE = 1 CY = 1

再來看看標志寄存器的值: 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ù)結果為零, AF表示(AL為一個字節(jié))相加進行到一半(低4位)有沒有向另一半(高4位)進位,也可以表示是否借位(減法)。 PF表示為偶數(shù), CF表示已經(jīng)發(fā)生進位,也可以表示借位。

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

這時AL: 0 + 0x1 + 1 = 0x02。

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

這里特別說下:

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

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

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

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

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

例如:

mov ax, low1

addax, low2

mov sumLow, ax

mov ax, high1

adc ax, high2

mov sumHigh, ax

這樣就實現(xiàn)了進位, low1, low2分別表示第一個數(shù)和第二個數(shù)的低2字節(jié), high1, high2分別表示第一個數(shù)和第二個數(shù)的高2字節(jié)。 當 addax, low2 產(chǎn)生了進位時, CF = 1。 后邊在執(zhí)行高2字節(jié)相加時用ADC會去獲取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

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

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

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚州免费一级毛片 | 国产精品自拍一区 | 婷婷爱五月 | 57pao一国产成视频永久免费 | 日日干综合| 99国产精品久久久久久久成人热 | 亚洲一区二区三 | 91在线亚洲 | 高清国产一级毛片国语 | 亚洲日韩成人 | 四虎最新紧急更新地址 | 99热久久这里只有精品9 | 私人影院在线播放 | 草的爽免费视频 | 中文字幕伦视频 | 337p日本大胆欧洲色噜噜高清 | 欧美亚洲一区二区三区四 | 精品一区二区三区的国产在线观看 | 天天做天天爱夜夜想毛片 | 亚洲国产欧美一区二区欧美 | 五月综合激情久久婷婷 | 国产成人免费观看 | 色视频网站人成免费 | 美日韩视频 | 福利在线看片 | 免费h| 亚洲爱爱天堂 | 99热视屏 | 91欧美在线 | 在线播放日本爽快片 | 亚洲免费观看 | 欧美成免费 | 亚洲狠狠成人综合网 | 欧美日韩免费在线视频 | 欧美成视频一theporn | 久久艹免费视频 | 奇米影视狠狠干 | 性欧美极品xxxx欧美一区二区 | 国语性猛交xxxx乱大交 | 337p日本欧洲亚洲大胆艺术 | 奇米777第四色 |