青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

匯編語言--標(biāo)志寄存器

 

標(biāo)志寄存器

CPU內(nèi)部的寄存器中,有一種特殊的寄存器(對(duì)于不同的處理機(jī),個(gè)數(shù)和結(jié)構(gòu)都可能不同)具有三種作用:

1) 用來存儲(chǔ)相關(guān)指令的某些執(zhí)行結(jié)果;

2) 用來為CPU執(zhí)行相關(guān)指令提供行為依據(jù);

3) 用來控制CPU的相關(guān)工作方式。

 

這種特殊的寄存器在8086CPU中,被稱為標(biāo)志寄存器。8086CPU的標(biāo)志寄存器有16位,其中存儲(chǔ)的信息通常被稱為程序狀態(tài)字(PSW)。簡(jiǎn)稱flag

flag和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個(gè)寄存器具有一個(gè)含義。

flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。

15    14 13 12   11 10        9    8   7   6   5   4     3   2   1   0

 

 

 

 

OF

DF

IF

TF

SF

ZF

 

AF

 

PF

 

CF

 

flag13512131415位在8086CPU中沒有使用,不具有任何含義,而其余位都具有特殊的含義。

 

 

ZF標(biāo)志

flag的第6位是ZF,零標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為0。如果結(jié)果為0,那么ZF=1,如果結(jié)果不為0,那么ZF=0

 

mov ax,1

sub ax,1

執(zhí)行后,結(jié)果為0,則ZF=1,表示“結(jié)果是0”。

 

mov ax,2

sub ax,1

執(zhí)行后,結(jié)果不為0,則ZF=0,表示“結(jié)果不是0”。

 

在計(jì)算機(jī)中0表示邏輯假,表示否定,1表示邏輯真,表示肯定。

 

注意,在8086CPU的指令集中,有的指令的執(zhí)行是影響標(biāo)志寄存器的,比如:addsubmuldivincorand等,它們大都是運(yùn)算指令(進(jìn)行邏輯或自述運(yùn)算);有的指令的執(zhí)行對(duì)標(biāo)志寄存器沒有影響,比如:movpushpop等,它們大都是傳送指令。

 

我們?cè)谑褂靡粭l指令的時(shí)候,要注意這條指令的全部功能,其中包括,執(zhí)行結(jié)果對(duì)標(biāo)記寄存器的哪些標(biāo)志位造成影響。

 

 

PF標(biāo)志

flag的第2位是PF,奇偶標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果的所有二進(jìn)制位中1的個(gè)數(shù)是否為偶數(shù)。如果1的個(gè)數(shù)為偶數(shù),PF=1,如果為奇數(shù),那么PF=0

比如:

mov al,1

add al,10

執(zhí)行后,結(jié)果為00001011B,其中有3(奇數(shù))個(gè)1,則PF=0

 

 

SF標(biāo)志

flag的第7位是SF,符號(hào)標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為負(fù)。如果結(jié)果為負(fù),SF=1,如果非負(fù),SF=0

 

我們知道計(jì)算機(jī)中通常用補(bǔ)碼來表示有符號(hào)數(shù)據(jù)。計(jì)算機(jī)中的一個(gè)數(shù)據(jù)可以看作是有符號(hào)數(shù),也可以看成是無符號(hào)數(shù)。比如:

00000001B,可以看作為無符號(hào)數(shù)1,或有符號(hào)數(shù)+1

10000001B,可以看作為無符號(hào)數(shù)129,也可以看作有符號(hào)數(shù)-127

這也就是說,對(duì)于同一個(gè)二進(jìn)制數(shù)據(jù),計(jì)算機(jī)可以將它當(dāng)作無符號(hào)數(shù)據(jù)來運(yùn)算,也可以當(dāng)作有符號(hào)數(shù)據(jù)來運(yùn)算。比如:

mov al,10000001B

add al,1

結(jié)果:(al)=10000010B

 

我們可以將add指令進(jìn)行的運(yùn)算當(dāng)作無符號(hào)數(shù)的運(yùn)算,那么add指令相當(dāng)于計(jì)算129+1,結(jié)果為13010000010B);也可以將add指令進(jìn)行的運(yùn)算當(dāng)作是有符號(hào)數(shù)的運(yùn)算,那么add指令相當(dāng)于計(jì)算-127+1,結(jié)果為-12610000010B)。

 

不管我們?nèi)绾慰创?/span>CPU在執(zhí)行add等指令的時(shí)候,就已經(jīng)包含了兩種含義,也將得到用同一種信息來記錄的兩種結(jié)果。關(guān)鍵在于我們?cè)诔绦蛐枰囊环N結(jié)果。

 

SF標(biāo)志,就是CPU對(duì)有符號(hào)數(shù)運(yùn)算結(jié)果的一種記錄,它記錄數(shù)據(jù)的正負(fù)。

在我們將數(shù)據(jù)當(dāng)作有符號(hào)數(shù)來運(yùn)算的時(shí)候,可以通過它來得知結(jié)果的正負(fù)。

如果我們將數(shù)據(jù)當(dāng)作無符號(hào)數(shù)來運(yùn)算,SF的值則沒有意義,雖然相關(guān)的指令影響了它的值。

 

這也就是說,CPU在執(zhí)行add等指令時(shí),是必須要影響到SF標(biāo)志位的值的。至于我們需不需要這種影響,那就看我們?nèi)绾慰创噶钏M(jìn)行的運(yùn)算了。

 

某些指令將影響標(biāo)志寄存器中的多個(gè)標(biāo)志位,這些被影響的標(biāo)記位比較全面地記錄了指令的執(zhí)行結(jié)果,為相關(guān)的處理提供了所需的依據(jù)。

比如指令sub al,al執(zhí)行后,ZFPFSF等標(biāo)志位都要受到影響,它們分別為:110,分別表示結(jié)果為零、結(jié)果二進(jìn)制數(shù)1的個(gè)數(shù)為偶數(shù)、結(jié)果不為負(fù)數(shù)。

 

 

 

CF標(biāo)志   [C,Carry進(jìn)位、F,Flag標(biāo)志]

flag的第0位是CF,進(jìn)位標(biāo)志位。一般情況下,在進(jìn)行了無符號(hào)運(yùn)算的時(shí)候,它記錄了運(yùn)算結(jié)果的最高有效位向更高位的進(jìn)位值,或從更高位的借位值。

 

對(duì)于倍數(shù)為N的無符號(hào)數(shù)來說,其對(duì)應(yīng)的二進(jìn)制信息的最高位,即第N-1位,就是它的最高有效位,而假想存在的第N位,就是相對(duì)于最高有效位的更高位。

 

當(dāng)兩個(gè)數(shù)據(jù)相加的時(shí)候,有可能產(chǎn)生從最高有效位向更高位的進(jìn)位。

由于這個(gè)進(jìn)位值有可能無法保存,我們?cè)谇懊娴恼n程中,就只是簡(jiǎn)單地說這個(gè)進(jìn)位值丟失了,其實(shí)CPU在運(yùn)算的時(shí)候,并不丟失這個(gè)進(jìn)位值,而是記錄在一個(gè)特殊的寄存器的某一位上。8086CPU就用flagCF位來記錄這個(gè)進(jìn)位值。

比如:

mov al,98H

add al,al          ;執(zhí)行后,(al) = 30H, CF=1, CF記錄了從最高有效位向更高位的進(jìn)位值

add al,al     ;執(zhí)行后,(al) = 60H, CF=0, CF記錄了從最高有效位向更高位的進(jìn)位值

 

而當(dāng)兩個(gè)數(shù)據(jù)做減法的時(shí)候,有可能向更高位借位。比如,兩個(gè)8位數(shù)據(jù):97H-98H,將產(chǎn)生借位,借位后,相當(dāng)于計(jì)算197H-98H。而flagCF位也可以用來記錄這個(gè)借位值。

比如:

mov al,97H

sub al,98H             ;執(zhí)行后,(al) = FFH, CF=1, CF記錄了向更高位的借位值

sub al,al                 ;執(zhí)行后,(al)=0,CF=0CF記錄了向更高位的借位值

 

OF標(biāo)志   [O,Overflow溢出,F,Flag標(biāo)志]

溢出:在進(jìn)行有符號(hào)數(shù)運(yùn)算的時(shí)候,如結(jié)果超過了機(jī)器所能表示的范圍稱為溢出。

 

那么,什么是機(jī)器所能表示的范圍呢?

比如說,指令運(yùn)算的結(jié)果用8位寄存器或內(nèi)存單元來存放,比如:add al,3,那么對(duì)于8位的有符號(hào)數(shù)據(jù),機(jī)器所能表示的范圍就是-128~127。同理,對(duì)于16位有符號(hào)數(shù),機(jī)器所能表示的范圍是-32768~32767

 

注意,這里所講的溢出,只是對(duì)有符號(hào)數(shù)運(yùn)算而言。

 

由于在進(jìn)行有符號(hào)數(shù)運(yùn)算時(shí),可能發(fā)生溢出而造成結(jié)果的錯(cuò)誤,則CPU需要對(duì)指令執(zhí)行后是否產(chǎn)生溢出進(jìn)行記錄。

 

flag的第11位是OF,溢出標(biāo)志位。一般情況下,OF記錄了有符號(hào)數(shù)運(yùn)算的結(jié)果是否發(fā)生了溢出。如果發(fā)生溢出,OF=1,如果沒有,OF=0

 

一定要注意CFOF的區(qū)別:CF是對(duì)無符號(hào)數(shù)運(yùn)算有意義的標(biāo)志位,而OF是對(duì)有符號(hào)數(shù)運(yùn)算有意義的標(biāo)志位。

比如:

mov al,98d

add al,99d

add指令執(zhí)行后:CF=0OF=1

CPU在執(zhí)行add等指令的時(shí)候,就包含了兩種含義:無符號(hào)數(shù)運(yùn)算和有符號(hào)數(shù)運(yùn)算。

對(duì)于無符號(hào)數(shù)運(yùn)算,CPUCF位來記錄是否產(chǎn)生了進(jìn)位;

對(duì)于有符號(hào)數(shù)運(yùn)算,CPUOF位來記錄是否產(chǎn)生了溢出,

當(dāng)然,還要用SF位來記錄結(jié)果的符號(hào)。

對(duì)于無符號(hào)數(shù)運(yùn)算,98+99沒有進(jìn)位,CF=0

對(duì)于有符號(hào)數(shù)運(yùn)算,98+99發(fā)生溢出,OF=1

 

CFOF所表示的進(jìn)位和溢出,是分別對(duì)無符號(hào)數(shù)和有符號(hào)數(shù)運(yùn)算而言的,它們之間沒有任何關(guān)系。

 

 

 

adc指令

adc是帶進(jìn)位的加法指令,它利用了CF位上記錄的進(jìn)位值。

指令格式:adc 操作對(duì)象1,操作對(duì)象2

功能:操作對(duì)象1=操作對(duì)象1+操作對(duì)象2+CF

比如指令adc ax,bx 實(shí)現(xiàn)的功能是:(ax) = (ax) + (bx) +CF

例:

mov ax,2

mov bx,1

sub bx,ax

adc ax,1

執(zhí)行后,(ax) = 4adc執(zhí)行時(shí),相當(dāng)于計(jì)算:(ax) + 1 + CF=2+1+1=4

 

adc指令比add指令多加了一個(gè)CF位的值。

 

為什么要加上CF的值呢?

CPU為什么要提供這樣一條指令呢?

CF的值的含義,在執(zhí)行adc指令的時(shí)候加上的CF的值的含義,由adc指令前面的指令決定的,也就是說,關(guān)鍵在于所加上的CF的值是被什么指令設(shè)置的。顯然,如果CF的值是被sub指令設(shè)置的,那么它的含義就是借位值;如果是被add指令設(shè)置的,那么它的含義就是進(jìn)位值。

 

加法可以分兩步來進(jìn)行:(1)低位相加;(2)高位相加再加上低位相加產(chǎn)生的進(jìn)位值。

下面的指令和add ax,bx具有相同的結(jié)果:

add al,bl

adc ah,bh

 

看來CPU提供的adc指令的目的,就是來進(jìn)行加法的第二步運(yùn)算的。

adc指令和add指令相配合可以對(duì)更大的數(shù)據(jù)進(jìn)行加法運(yùn)算。

 

舉例:編程,計(jì)算1EF000H+201000H,結(jié)果放在ax(高16位)和bx(低16位)中。

因?yàn)閮蓚€(gè)數(shù)據(jù)的位數(shù)都大于16,用add指令無法進(jìn)行計(jì)算。我們將計(jì)算分兩步進(jìn)行,先將低16位相加,然后將高16位和進(jìn)位值相加。程序如下:

mov ax,001EH              ;16

mov bx,0f000H             ;16

add bx,1000H               ;16位相加

adc ax,0020H                ;16位相加,并加上CF進(jìn)位值。

 

adc指令執(zhí)行后,也可能產(chǎn)生進(jìn)位值,所以也會(huì)對(duì)CF位進(jìn)行設(shè)置。

由于有這樣的功能,我們就可以對(duì)任意大的數(shù)據(jù)進(jìn)行加法運(yùn)算。

 

incloop指令不影響CF位。

 

 

 

sbb指令

sbb是帶借位減法指令,它利用了CF位上記錄的借位值。

 

指令格式:sbb 操作對(duì)象1,操作對(duì)象2

功能:操作對(duì)象1=操作對(duì)象1-操作對(duì)象2-CF

比如指令 sbb ax,bx 實(shí)現(xiàn)的功能是:(ax) = (ax) – (bx) – CF

 

sbb指令執(zhí)行后,將對(duì)CF進(jìn)行設(shè)置。

利用sbb指令我們可以對(duì)任意大的數(shù)據(jù)進(jìn)行減法運(yùn)算。

比如,計(jì)算003E1000H – 00202000H,結(jié)果放在ax,bx中,程序如下:

mov bx,1000H

mov ax,003EH

sub bx,2000H        ;(bx) = (bx)-2000HCF設(shè)置借位數(shù) 1

sbb ax,0020H         ;(ax) = (bx) – 0020H – CF

 

sbbadc是基于同樣的思想設(shè)計(jì)的兩條指令,在應(yīng)用思路上和adc類似。

 

 

cmp指令

cmp是比較指令,cmp的功能相當(dāng)于減法指令,只是不保存結(jié)果。

cmp指令執(zhí)行后,將對(duì)標(biāo)志寄存器產(chǎn)生影響。其他相關(guān)指令通過識(shí)別這些被影響的標(biāo)志寄存器位來得知比較結(jié)果。

 

cmp指令格式:cmp 操作對(duì)象1,操作對(duì)象2

功能:計(jì)算操作對(duì)象1-操作對(duì)象2,但并不保存結(jié)果,僅僅根據(jù)計(jì)算結(jié)果對(duì)標(biāo)志寄存器進(jìn)行設(shè)置。

 

比如,指令cmp ax,ax,做(ax)-(ax)的運(yùn)算,結(jié)果為0,但并不在ax中保存,僅影響flag的相關(guān)各位。指令執(zhí)行后,ZF=1PF=1SF=0CF=0OF=0

舉例:

mov ax,8

mov bx,3

cmp ax,bx

執(zhí)行后:(ax)=8ZF=0PF=1SF=0CF=0OF=0

 

其實(shí),通過cmp指令執(zhí)行后,相關(guān)標(biāo)志位的值就可以看出比較的結(jié)果。

cmp ax,bx

如果(ax) = (bx) (ax) – (bx) = 0,所以:ZF = 1

如果(ax)(bx) (ax) – (bx)0,所以:ZF = 0

如果(ax)<(bx) (ax) – (bx) 將產(chǎn)生借位,所以:CF=1

如果(ax)(bx) (ax) – (bx) 將不必借位,所以:CF=0

如果(ax)>(bx) (ax)-(bx)既不必借位,結(jié)果又不為0,所以:CF=0 并且 ZF=0

如果(ax)(bx) (ax)-(bx)既可能借位,結(jié)果也可能為0,所以:CF=1 ZF=1

 

現(xiàn)在我們可以看出比較指令的設(shè)計(jì)思路,即:通過做減法運(yùn)算,影響標(biāo)志寄存器,標(biāo)志寄存器的相關(guān)位記錄了比較的結(jié)果。反過來看上面的例子:

指令cmp ax,bx的邏輯含義是比較axbx中的值,如果執(zhí)行后:

ZF=1,說明(ax)=(bx)

ZF=0,說明(ax)(bx)

CF=1,說明(ax)<(bx)

CF=0,說明(ax)(bx)

CF=0 并且 ZF=0,說明(ax)>(bx)

CF=1 ZF=1,說明(ax)(bx)

 

addsub指令一樣,CPU在執(zhí)行cmp指令的時(shí)候,也包含兩種含義:進(jìn)行無符號(hào)數(shù)運(yùn)算和進(jìn)行有符號(hào)數(shù)運(yùn)算。

 

所以利用cmp指令可以對(duì)無符號(hào)數(shù)進(jìn)行比較,也可以對(duì)有符號(hào)數(shù)進(jìn)行比較。

上面是用cmp進(jìn)行無符號(hào)數(shù)比較時(shí),相關(guān)標(biāo)志位對(duì)比較結(jié)果的記錄。

下面來看一下如果用cmp來進(jìn)行有符號(hào)數(shù)比較時(shí),CPU用哪些標(biāo)志位對(duì)比較結(jié)果進(jìn)行記錄。

cmp ah,bh

如果(ah)=(bh) (ah)-(bh)=0,所以ZF=1

如果(ah)(bh) (ah)-(bh)0,所以ZF=0

 

對(duì)于有符號(hào)數(shù)運(yùn)算,在(ah)<(bh)情況下,(ah)-(bh)顯然可能引起SF=1,即結(jié)果為負(fù)。

比如:

(ah)=1(bh)=2;則(ah) – (bh)=0FFH0FFH-1的補(bǔ)碼,因?yàn)榻Y(jié)果為負(fù),所以SF=1

(ah)=0FEH(bh)=0FFH;則(ah) – (bh)= – 2 – (–1)=0FFH,因?yàn)榻Y(jié)果為負(fù),所以SF=1

 

(ah)=22H(bh)=0A0H;則(ah) – (bh)=34 – (-96)=82H82H-126的補(bǔ)碼,所以SF=1

 

兩個(gè)有符號(hào)婁AB相減,得到的是負(fù)數(shù),那么可以肯定A<B,這個(gè)思路沒有錯(cuò)誤,關(guān)鍵在于我們根據(jù)什么來斷定得到的是一個(gè)負(fù)數(shù)。CPUcmp指令得到的結(jié)果記錄在flag的相關(guān)標(biāo)志位中。我們可以根據(jù)指令執(zhí)行后,相關(guān)標(biāo)志位的值來判斷比較的結(jié)果。單純地考察SF的值不可能知道結(jié)果的正負(fù)。因?yàn)?/span>SF記錄的只是可以在計(jì)算機(jī)中存放的相應(yīng)位數(shù)的結(jié)果的正負(fù),比如add ah,al執(zhí)行后,SF記錄的是ah中的8位二進(jìn)制信息所表示的數(shù)據(jù)的正負(fù)。cmp ah,bh執(zhí)行后,SF記錄的是(ah)-(bh)所得到的8位二進(jìn)制信息所表示的數(shù)據(jù)的正負(fù),雖然這個(gè)結(jié)果沒有在我們能夠使用的寄存器或內(nèi)存單元中保存,但是在指令執(zhí)行的過程中,它暫存在CPU內(nèi)部的暫存器中。

所得到的相應(yīng)結(jié)果的正負(fù),并不能說明,運(yùn)算所應(yīng)該得到的結(jié)果的正負(fù)。這是因?yàn)樵谶\(yùn)算的過程中可能發(fā)生溢出。如果有這樣的情況發(fā)生,那么,SF的值就不能說明任何問題。

比如:

mov ah,22H

mov bh,0A0H

sub ah,bh

結(jié)果SF=1,運(yùn)算實(shí)際符號(hào)得到的結(jié)果是(ah)=82H,但是在邏輯上,運(yùn)算所應(yīng)該得到的結(jié)果是:34 – (– 96)=130。就是因?yàn)?/span>130這個(gè)結(jié)果作為一個(gè)有符號(hào)數(shù)超出了-128~127這個(gè)范圍,在ah中不能表示,而ah中的結(jié)果被CPU當(dāng)作有符號(hào)數(shù)解釋為-126。而SF被用來記錄這個(gè)實(shí)際結(jié)果的正負(fù),所以SF=1。但SF=1不能說明在邏輯上運(yùn)算所得的正確結(jié)果的正負(fù)。

 

但是邏輯上的結(jié)果的正負(fù),才是cmp指令所求的真正結(jié)果,因?yàn)槲覀兙褪且克玫絻蓚€(gè)操作對(duì)象的比較信息。所以cmp指令所作的比較結(jié)果,不是僅僅靠SF就能記錄的,因?yàn)樗荒苡涗泴?shí)際結(jié)果的正負(fù)。

 

兩種結(jié)果之間的關(guān)系,實(shí)際結(jié)果的正負(fù),和邏輯上真正結(jié)果的正負(fù),它們之間有多大的距離呢?

實(shí)際結(jié)果的正負(fù),之所以不能說明邏輯上真正結(jié)果的正負(fù),關(guān)鍵的原因在于發(fā)生了溢出。如果沒有溢出發(fā)生的話,那么,實(shí)際結(jié)果的正負(fù)和邏輯上真正結(jié)果的正負(fù)就一致了。

 

所以,我們應(yīng)該在考察SF(得知實(shí)際結(jié)果的正負(fù))的同時(shí)考察OF(得到有沒有溢出),就可以得知邏輯上真正結(jié)果的正負(fù),同時(shí)就可以知道比較的結(jié)果。

 

總結(jié),cmp ah,bh

1) 如果SF=1,而OF=0

OF=0,說明沒有溢出,邏輯上真正結(jié)果的正負(fù)=實(shí)際結(jié)果的正負(fù);

SF=1,實(shí)際結(jié)果為負(fù),所以邏輯上真正的結(jié)果為負(fù),所以(ah)<(bh)

 

2) 如果SF=1,而OF=1

OF=1,說明有溢出,邏輯上真正結(jié)果的正負(fù)≠實(shí)際結(jié)果的正負(fù);

SF=1,實(shí)際結(jié)果為負(fù)。

實(shí)際結(jié)果為負(fù),而又有溢出,這說明是由于溢出導(dǎo)致了實(shí)際結(jié)果為負(fù),簡(jiǎn)單分析一下,就可以看出,如果因溢出導(dǎo)致了實(shí)際結(jié)果為負(fù),那么邏輯上真正的結(jié)果必須為正。

這樣,SF=1OF=1,說明了(ah)>(bh)

 

3) 如果SF=0,而OF=1

OF=1,說明有溢出,邏輯上真正結(jié)果的正負(fù)≠實(shí)際結(jié)果的正負(fù);

SF=0,實(shí)際結(jié)果非負(fù),而OF=1說明有溢出,則結(jié)果非0,所以實(shí)際結(jié)果為正。

實(shí)際結(jié)果為正,而又有溢出,這說明是由于溢出導(dǎo)致了實(shí)際結(jié)果非負(fù),簡(jiǎn)單分析一下,就可以看出,如果因?yàn)橐绯鰧?dǎo)致了實(shí)際結(jié)果為正,那么邏輯上真正的結(jié)果必須為負(fù)

這樣,SF=0OF=1,說明了(ah)<(bh)

 

4) 如果SF=0,而OF=0

OF=0,說明沒有溢出,邏輯上真正結(jié)果的正負(fù)=實(shí)際結(jié)果的正負(fù);

SF=0,實(shí)際結(jié)果非負(fù),所以邏輯上真正的結(jié)果非負(fù),所以(ah)(bh)

 

8086CPU這種工作機(jī)制的設(shè)計(jì)思想,實(shí)際上,對(duì)于各種處理機(jī)來說是普遍的。

 

 

 

檢測(cè)比較結(jié)果的條件轉(zhuǎn)移指令

“轉(zhuǎn)移”指的是它能夠修改IP,而“條件”指的是它可以根據(jù)某種條件,決定是否修改IP

比如:jcxz就是一個(gè)條件轉(zhuǎn)移指令,它可以檢測(cè)cx中的數(shù)值,如果(cx)=0,就修改IP,否則什么也不做。

所有條件轉(zhuǎn)移指令的轉(zhuǎn)移位移都是[-128~127]

 

除了jcxz之外,CPU還提供了其他條件轉(zhuǎn)移指令,大多數(shù)條件轉(zhuǎn)移指令都檢測(cè)標(biāo)志寄存器的相關(guān)標(biāo)志位,根據(jù)檢測(cè)的結(jié)果來決定是否修改IP

它們檢測(cè)的是哪些標(biāo)志位呢?就是被cmp指令影響的那些,表示比較結(jié)果的標(biāo)志位。這些條件轉(zhuǎn)移指令通常都和cmp相配合使用,就好像callret指令通常相配合使用一樣。

 

因?yàn)?/span>cmp指令可以同時(shí)進(jìn)行兩種比較,無符號(hào)數(shù)比較和有符號(hào)數(shù)比較,所以根據(jù)cmp指令的比較結(jié)果進(jìn)行轉(zhuǎn)移的指令也分為兩種,即:

根據(jù)無符號(hào)數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測(cè)ZFCF的值;

和根據(jù)有符號(hào)數(shù)的比較結(jié)果進(jìn)行了轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測(cè)SFOFZF的值。

 

常用的根據(jù)無符號(hào)數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令:

指令

含義

檢測(cè)的相關(guān)標(biāo)志位

je

等于則轉(zhuǎn)移

ZF=1

jne

不等于則轉(zhuǎn)移

ZF=0

jb

低于則轉(zhuǎn)移

CF=1

jnb

不低于則轉(zhuǎn)移

CF=0

ja

高于則轉(zhuǎn)移

CF=0 ZF=0

jna

不高于則轉(zhuǎn)移

CF=1 ZF=1

 

j   表示jump             轉(zhuǎn)移

e 表示equal             等于

ne:表示not equal        不等于

b 表示below            小于

nb:表示not below      不小于

a 表示above            大于

na:表示not above       不大于

 

 

編程實(shí)現(xiàn)如下功能:

如果(ah)=(bh)(ah)=(ah)+(ah),否則(ah)=(ah)+(bh)

cmp ah,bh

je s

add ah,bh

jmp short ok

s:add ah,ah

ok:…

 

上面的程序執(zhí)行時(shí),如果(ah)=(bh),則cmp ah,bh 使ZF=1,而je檢測(cè)ZF是否為1,如果為1,將轉(zhuǎn)移到標(biāo)號(hào)s處執(zhí)行指令 add ah,ah。這也可以說,cmp比較ahbh后所得到的相等的結(jié)果使得je指令進(jìn)行轉(zhuǎn)移。從而很好地體現(xiàn)了je指令的邏輯含義,相等則轉(zhuǎn)移。

 

雖然je的邏輯含義是“相等則轉(zhuǎn)移”,但它進(jìn)行的操作是,ZF=1時(shí)則轉(zhuǎn)移。

“相等則轉(zhuǎn)移”這種邏輯含義,是通過和cmp指令配合使用來體現(xiàn)的,因?yàn)?/span>cmp指令為“ZF=1”賦予了“兩數(shù)相等”的含義。

至于究竟在je之前使不使用cmp指令,在于我們?cè)诎才?/span>je檢測(cè)的是ZF位置,不管je前面是什么指令,只要CPU執(zhí)行je指令時(shí),ZF=1,那么就會(huì)發(fā)生轉(zhuǎn)移。

 

如何配合使用這些指令,完全取決于程序作者。

 

 

雖然我們分別討論了cmp指令和與其比較結(jié)果相關(guān)的有條件轉(zhuǎn)移指令,但是它們經(jīng)常在一起配合使用。所以我們?cè)诼?lián)合應(yīng)用它們的時(shí)候,不必再考慮cmp指令對(duì)相關(guān)標(biāo)志位的影響和je等指令對(duì)相關(guān)標(biāo)志位的檢測(cè)。因?yàn)橄嚓P(guān)的標(biāo)志位,只是為cmpje等指令傳遞比較結(jié)果。我們可以直接考慮cmpje等指令配合使用時(shí),表現(xiàn)出來的邏輯含義。它們?cè)诼?lián)合使用的時(shí)候表現(xiàn)出來的功能有些像高級(jí)語言中的IF語句。

 

 

上面講解了根據(jù)無符號(hào)數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令。根據(jù)有符號(hào)數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令的工作原理和無符號(hào)的相同,只是檢測(cè)了不同的標(biāo)志位。

cmp、標(biāo)志寄存的相關(guān)位、條件轉(zhuǎn)移指令三者配合應(yīng)用,這個(gè)原理具有普遍性。

 

 

 

DF標(biāo)志和串傳送指令

flag的第10位是DFDirection Flag,方向標(biāo)志位。

在串處理指令中,控制每操作后sidi的增減。

DF=0,每次操作后sidi遞增;

DF=1,每次操作后sidi遞減。

 

串傳送指令:

格式:movsb

功能:執(zhí)行movsb 指令相當(dāng)于進(jìn)行下面幾步操作:

1((es)*16+(di)) = ((ds)*16+(si))

2)如果DF=0則:(si)=(si)+1

                             (di)=(di)+1

   如果DF=1則:(si)=(si)-1

                             (di)=(di)-1

用匯編語法描述movsb的功能如下:

mov es:[di],byte ptr ds:[si]           ;8086CPU并不支持這樣的指令,這里只是個(gè)描述。

如果DF=0

inc si

inc di

如果DF=1

dec si

dec di

 

movsb指令的功能是將ds:si指向的內(nèi)存單元中的字節(jié)送入es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將sidi遞增或遞減。

也可以傳送一個(gè)字,指令如下:

格式:movsw

movsw的功能是將ds:si指向的內(nèi)存單元中word送入es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將sidi遞增2或遞減2

用匯編語法描述movsw的功能如下:

mov es:[di], word ptr ds:[si]        ;8086CPU并不支持這樣的指令,這里只是個(gè)描述。

如果DF=0

add si,2

add di,2

如果DF=1

sub si,2

sub di,2

 

movsbmovsw進(jìn)行的是串傳送操作中的一個(gè)步驟,一般來說,movsbmovsw都和rep配合使用,格式如下:

rep movsb

用匯編語法來描述rep movsb的功能就是:

s:movsb

loop s

 

可見,rep的作用是根據(jù)cx的值,重復(fù)執(zhí)行后面的串傳送指令。

由于每執(zhí)行一行movsb指令,sidi都會(huì)遞增或遞減指向后一個(gè)單元或前一個(gè)單元,則rep movsb就可以循環(huán)實(shí)現(xiàn)(cx)個(gè)字符的傳送。

同理,movsw也有類似功能。

 

由于flagDF位決定著串傳送指令執(zhí)行后,sidi改變的方向,所以CPU應(yīng)該提供相應(yīng)的指令來對(duì)DF位進(jìn)行設(shè)置,從而使程序員能夠決定傳送的方向。

 

8086CPU提供下面兩條指令對(duì)DF位進(jìn)行設(shè)置:

cld指令:將標(biāo)志寄存器的DF位置0

std指令:將標(biāo)志寄存器的DF位置1

 

編程:用串傳送指令,將data段中的第一個(gè)字符串復(fù)制到它后面的空間中。

data segment

       db ‘Welcome to masm!’

       db 16 dup (0)

data ends

分析:使用串傳送指令進(jìn)行數(shù)據(jù)的傳送,需要給它提供一些必要的信息:

1) 傳送的原始位置:ds:si

2) 傳送的目的位置:es:di

3) 傳送的長(zhǎng)度:cx

4) 傳送的方向:DF

 

mov ax,data

mov ds,ax

mov si,0                ;ds:si指向data:0

mov es,ax

mov di,16              ;es:di指向data:16

mov cx,16             ;(cx)=16, rep循環(huán)16

cld                        ;設(shè)置DF=0,正向傳送

rep movsb

 

 

 

pushfpopf

pushf的功能是將標(biāo)志寄存器的值壓棧,而popf是從棧中彈出數(shù)據(jù),送入標(biāo)志寄存器中。

 

 

pushfpopf,為直接訪問標(biāo)志寄存器提供了一種方法。

 

 

標(biāo)志寄存器在Debug中的表示

Debug中,標(biāo)志寄存器是按照有意義的各個(gè)標(biāo)志位單獨(dú)表示的。

 

 

 

 

 

 

 

posted on 2010-08-04 10:33 luqingfei 閱讀(5201) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 匯編語言基礎(chǔ)學(xué)習(xí)

導(dǎo)航

<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統(tǒng)計(jì)

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性做久久久久久久久| 亚洲深夜影院| 欧美综合国产| 欧美一区二区成人6969| 亚洲一区二区三区精品视频| 亚洲一区二区三区中文字幕在线 | 亚洲午夜电影在线观看| 一区二区三区精品在线| 欧美一区二区高清在线观看| 久久亚洲私人国产精品va| 美女网站久久| 欧美视频免费| 国产热re99久久6国产精品| 黄网站色欧美视频| 亚洲九九九在线观看| 亚洲欧美日韩中文播放| 亚洲一本视频| 亚洲国产精品www| 久久国产精彩视频| 欧美成人午夜激情视频| 亚洲精品黄网在线观看| 性欧美大战久久久久久久免费观看| 久久久久久尹人网香蕉| 欧美人与性动交a欧美精品| 国产视频一区欧美| 一区二区三区产品免费精品久久75| 欧美一区午夜精品| 亚洲高清资源| 久久黄色网页| 国产精品毛片高清在线完整版| 亚洲国产成人av在线| 午夜精品电影| 日韩午夜高潮| 欧美成人午夜剧场免费观看| 国产一区二区三区黄| 亚洲欧美大片| 亚洲伦理网站| 欧美大片在线影院| 136国产福利精品导航网址| 欧美在线不卡| 中文一区在线| 欧美日韩国产成人在线免费| 亚洲国产精品va| 久久综合五月| 久久大综合网| 国产欧美一区二区精品性色| 亚洲一级二级| 亚洲免费观看在线视频| 欧美激情免费观看| 91久久国产综合久久蜜月精品| 麻豆成人在线| 久久精品在线| 韩日欧美一区二区| 久久一区二区三区四区五区| 欧美影片第一页| 伊人激情综合| 欧美mv日韩mv国产网站| 久久久久在线| 亚洲第一在线| 欧美国产日韩亚洲一区| 欧美电影免费观看| 亚洲乱码日产精品bd| 欧美大片91| 老司机精品视频网站| 在线日韩欧美视频| 欧美激情国产日韩| 欧美日韩精品欧美日韩精品| 亚洲一区二区三区四区视频| 日韩亚洲不卡在线| 欧美先锋影音| 亚洲人成久久| 国产欧美日本一区二区三区| 亚洲欧洲日本mm| 国产亚洲欧洲一区高清在线观看 | 亚洲国产福利在线| 久久久国产亚洲精品| 狠狠综合久久av一区二区小说| 久久免费视频一区| 久久综合国产精品| 亚洲理论电影网| 一区二区三区毛片| 黑人操亚洲美女惩罚| 欧美激情按摩在线| 欧美日韩精品免费| 欧美中文字幕不卡| 久久久久久久网| av不卡在线看| 午夜精品一区二区三区在线视 | 一区二区亚洲精品| 91久久国产综合久久| 国产精品欧美精品| 欧美韩日一区| 国产欧美另类| 亚洲精品一区二区三区av| 国产麻豆成人精品| 亚洲精品1区2区| 国产一区二区三区四区在线观看| 欧美a级大片| 国产精品国产三级国产普通话99| 久久久久九九九九| 欧美日韩大片一区二区三区| 久久综合九色欧美综合狠狠| 欧美日本二区| 久久亚洲精品视频| 国产精品国产馆在线真实露脸| 猛男gaygay欧美视频| 国产精品女主播在线观看 | 久久色中文字幕| 欧美日韩一区二区在线播放| 久久综合久久久久88| 国产精品啊v在线| 欧美aⅴ一区二区三区视频| 国产精品美女久久久| 日韩视频第一页| 亚洲国产精品激情在线观看| 欧美一区二区三区四区夜夜大片 | 欧美成人a视频| 久久免费午夜影院| 国产伦精品一区二区三| 一区二区av| 一区二区三区久久网| 欧美不卡高清| 亚洲国产合集| 91久久午夜| 蜜臀av一级做a爰片久久| 久久久久.com| 国产欧美日韩精品一区| 亚洲一级特黄| 午夜欧美理论片| 欧美理论片在线观看| 欧美一级专区| 亚洲欧美国产毛片在线| 欧美高清视频www夜色资源网| 久久视频国产精品免费视频在线| 国产精品毛片高清在线完整版 | 欧美一区二区国产| 亚洲欧美制服中文字幕| 国产精品乱码一区二三区小蝌蚪| 亚洲美女精品成人在线视频| 亚洲日本无吗高清不卡| 欧美激情一区在线观看| 欧美激情一区二区三区四区| 亚洲盗摄视频| 欧美成人精品三级在线观看| 亚洲国产精品久久精品怡红院| 亚洲激情网址| 欧美日韩激情小视频| 99视频在线观看一区三区| 亚洲天堂激情| 国产主播一区| 裸体女人亚洲精品一区| 亚洲国产精品成人综合色在线婷婷| 亚洲韩国日本中文字幕| 欧美日韩第一区日日骚| 亚洲自拍偷拍一区| 免费精品视频| 一区二区三区欧美成人| 国产精品国产一区二区| 欧美一级淫片aaaaaaa视频| 欧美成人精品三级在线观看| 亚洲日本欧美日韩高观看| 欧美久久视频| 亚洲香蕉在线观看| 麻豆国产精品777777在线| 日韩视频一区二区三区在线播放免费观看 | 一区二区免费看| 欧美一区二区三区日韩视频| 国外成人在线视频网站| 欧美插天视频在线播放| 中文亚洲字幕| 美日韩丰满少妇在线观看| 在线亚洲精品| 国产香蕉97碰碰久久人人| 牛牛国产精品| 午夜欧美视频| 亚洲人成在线免费观看| 久久久久一区二区三区| 一区二区三区精品国产| 一区二区三区在线不卡| 欧美色图一区二区三区| 久久人人精品| 欧美亚洲综合网| 亚洲精品免费一二三区| 久久久久久久久一区二区| 亚洲专区在线视频| 亚洲欧洲另类国产综合| 一区二区三区自拍| 国产日韩亚洲欧美精品| 欧美日韩国产经典色站一区二区三区| 亚洲欧美一级二级三级| 91久久在线播放| 欧美不卡视频一区| 久久精品国产一区二区电影 | 欧美成人a视频| 亚洲欧美在线视频观看| 亚洲伦理在线免费看| 伊人成人在线视频| 国产情人节一区| 国产精品久久二区| 欧美日韩一区成人|