彙編中的TEST指令

2021-03-07 10:26:32 字數 3204 閱讀 3622

1樓:匿名使用者

test執行的就是and的指令,只不過不會儲存and執行的結果,而是根據and的結果設定flags暫存器的各種標誌

test al, 08h 就是測試al的第4位是不是1,8h = 0000 1000

同理test ax, 0200h 測試ax的第10位, 0200h = 0000 0010 0000 0000

test cl, 01h 測試cl的第1位,01h = 0000 0001

比如test al, 01h

jz zero ; al的第一位是0

jnz one ; al的第一位是1

2樓:匿名使用者

test屬於邏輯運算指令,其功能為功能執行bit與bit之間的邏輯運算和測試功能(兩運算元作與運算,僅修改標誌位,不回送結果)。

test對兩個引數(目標,源)執行and邏輯操作,並根據結果設定標誌暫存器,結果本身不會儲存。est ax, bx與and ax, bx命令有相同效果。test語法規格:

test r/m,r/m/data。其影響標誌包括:c,o,p,z,s(其中c與o兩個標誌會被設為0)。

test的運用舉例:利用test指令測試一個位,例如暫存器:

test eax, 100b;/b字尾意為二進位制/

jnz ******;/如果eax右數第三個位為1,jnz將會跳轉/

jnz跳轉的條件非0,即zf=0,zf=0意味著零標誌沒被置位,即邏輯與結果為1。

與彙編指令test功能相仿的還有cmp指令,cmp屬於算術運算指令,其功能為功能為比較兩個值(暫存器,記憶體,直接數值),與test指令的測試功能相仿,其語法格式為cmp r/m,r/m/data,影響的標誌位包括c,p,a,z,o。

cmp比較.(兩運算元作減法,僅修改標誌位,不回送結果)。cmp實際上是隻設定標誌不儲存結構的減法,並設定z-flag(零標誌)。

零標誌很像carry,也是內部標誌暫存器的一位。

3樓:匿名使用者

test指令是測試指令,用於測試某些位是否為0,執行的是與運算,並且會將cf和of置0,並且影響sf,zf。若測試的位均為0,則sf=0,zf=1。

舉個例子吧。

mov al,40h

test al,08h

執行起來就是

0100 0000(40h)

0000 1000(08h)

意思就是測試40h的左起第四位是否為0.

測試的結果是為0,

所以各標誌位的狀態是:cf=0,of=0,sf=0,cf=1

4樓:anna王爾德

看過破解教程,都知道test,cmp是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.

首先看看:狀態暫存器(即標誌暫存器)

psw(program flag)程式狀態字(即標誌)暫存器,是一個16位暫存器,由條件碼標誌(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

條件碼:

①of(overflow flag)溢位標誌,溢位時為1,否則置0.標明一個溢位了的計算,如:結構和目標不匹配.

②sf(sign flag)符號標誌,結果為負時置1,否則置0.

③zf(zero flag)零標誌,運算結果為0時置1,否則置0.

④cf(carry flag)進位標誌,進位時置1,否則置0.注意:carry標誌中存放計算後最右的位.

⑤af(auxiliary carry flag)輔助進位標誌,記錄運算時第3位(半個位元組)產生的進位置。

有進位時1,否則置0.

⑥pf(parity flag)奇偶標誌.結果運算元中1的個數為偶數時置1,否則置0.

控制標誌位:

⑦df(direction flag)方向標誌,在串處理指令中控制資訊的方向。

⑧if(interrupt flag)中斷標誌。

⑨tf(trap flag)陷井標誌。

為舉例方便說一下jnz和jz

測試條件

jz   zf=1

jnz  zf=0

即jz=jump if zero (結果為0則設定zf零標誌為1,跳轉)

jnz=jump if not zero

好,接著來看test和cmp

test屬於邏輯運算指令

功能: 執行bit與bit之間的邏輯運算

測試(兩運算元作與運算,僅修改標誌位,不回送結果).

test對兩個引數(目標,源)執行and邏輯操作,並根據結果設定標誌暫存器,結果本身不會儲存。test ax,bx 與 and ax,bx 命令有相同效果

語法: test r/m,r/m/data

影響標誌: c,o,p,z,s(其中c與o兩個標誌會被設為0)

運用舉例:

1.test用來測試一個位,例如暫存器:

test eax, 100b;          b字尾意為二進位制

jnz  ******;             如果eax右數第三個位為1,jnz將會跳轉

我是這樣想的,jnz跳轉的條件是zf=0,zf=0意味著zf(零標誌)沒被置位,即邏輯與結果為1.

2.test的一個非常普遍的用法是用來測試一方暫存器是否為空:

test ecx, ecx

jz somewhere

如果ecx為零,設定zf零標誌為1,jz跳轉

cmp屬於算術運算指令

功能: 比較兩個值(暫存器,記憶體,直接數值)

語法: cmp r/m,r/m/data

標誌位: c,p,a,z,o

cmp比較.(兩運算元作減法,僅修改標誌位,不回送結果).

cmp實際上是隻設定標誌不儲存結構的減法,並設定z-flag(零標誌).

零標誌很像carry,也是內部標誌暫存器的一位.

例如:cmp eax, 2;       如果eax-2=0即eax=2就設定零標誌為1

jz ****;          如果設定了零標誌就跳轉

我得出的結論

test邏輯與運算結果為零,就把zf(零標誌)置1;

cmp 算術減法運算結果為零,就把zf(零標誌)置1

5樓:匿名使用者

test是執行與運算,結果不存入目的暫存器中!自己動手算下哈,ok?

jne的彙編指令是什麼,這條彙編指令是什麼意思?

彙編指令是組合語言中使用的一些操作符和助記符,還包括一些偽指令 如assume,end 用於告訴彙編程式如何進行彙編的指令,它既不控制機器的操作也不被彙編成機器 只能為彙編程式所識別並指導彙編如何進行。jne是彙編指令中的一個條件轉移指令。當zf 0,轉至標號處執行。1.分類 彙編指令按功能可分為以...

彙編程式sbb指令,彙編程式SBB指令

學校畢業後就沒用過彙編了,sbb指令 一看還以為是sb的暱稱呢 sbb指令 sbb是帶借位減法專指令,它利用 屬了cf位上記錄的借位值。指令格式 sbb 操作物件1,操作物件2 功能 操作物件1 操作物件1 操作物件2 cf若ax 1020h,bx 1200h,cf 1,則sbb ax,bx的執行後...

這段彙編指指令是什麼意思,這條彙編指令是什麼意思?

div dword ptr ecx 14 這種情況是 edx eax dword ptr ecx 14 edx 餘,eax 商 片段的大致意思是 a b c 其中a dword ptr eax b dword ptr eax 4 c dword ptr ecx 8 具體功能應參照上下文!div是除法...