組合語言中test的用法,彙編中的TEST指令

2021-08-14 23:00:17 字數 4688 閱讀 1202

1樓:蘇嘉愛娛樂

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

test ax,bx 與 and ax,bx 命令有相同效果,只是test指令不改變ax和bx的內容,而and指令會把結果儲存到ax中。

test命令將兩個運算元進行邏輯與運算,並根據運算結果設定相關的標誌位。但是,test命令的兩個運算元不會被改變。運算結果在設定過相關標記位後會被丟棄。

est的一個非常普遍的用法是用來測試一方暫存器是否為空:test ecx, ecx jz somewhere,如果ecx為零,設定zf零標誌為1,jz跳轉。

擴充套件資料

pytest :

pytest 允許你在任何名為 test_*.py 的檔案中定義測試,並將其定義為以 test_* 開頭的函式。然後,pytest 將在整個專案中查詢所有測試,並在控制檯中執行 pytest 時自動執行這些測試。

pytest 接受標誌和引數 ,它們可以在測試執行器停止時更改,這些包含如何輸出結果,執行哪些測試以及輸出中包含哪些資訊。

它還包括一個 set_trace() 函式,它可以進入到你的測試中。它會暫停您的測試, 並允許你與變數進行互動,不然你只能在終端中「四處翻弄」來除錯你的專案。pytest 最好的一方面是其強大的外掛生態系統。

2樓:匿名使用者

為舉例方便說一下jnz和jz

測試條件

jz zf=1

jnz zf=0

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

jnz=jump if not zero

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跳轉

3樓:無地自容射手

組合語言中,test的用法你可以。到相關的組合語言的書裡進行了解

彙編中的test指令

4樓:匿名使用者

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

5樓:匿名使用者

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,也是內部標誌暫存器的一位。

6樓:匿名使用者

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

7樓: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

8樓:匿名使用者

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

組合語言中的push的用法,組合語言中的PUSH的用法

push的操作過程是 sp sp 2,sp oprd 即先修改堆疊指標sp 壓入時為自動減2 然後,將指定 的運算元送入新的棧頂位置。此處的 sp oprd,也可以理解為 ss 16 sp oprd 或 ss sp oprd 示例 push dx push bp push cs push data1...

組合語言資料段問題,組合語言中定義的資料段的問題

如果1000h只是偏移地址,段地址由系統指定,可用下面方法 data segment org 1000h 用來指定下面資料或指令的偏移地址從該值開始 db 38h,4ah,2bh,80h,64h,0a7h,0bbh,9ch,83h,0f6h data ends 如果1000h是實體地址,則要先把它轉...

組合語言程式設計,組合語言程式設計

教你一個小招,用vc6.0編好一個c的程式,然後alt 8可以檢視彙編程式 1 include 2 void main void 3 00401055 jmp main 21h 00401031 10 for i 0 i 4 i 00401057 mov dword ptr ebp 14h 0 00...