80x86汇编按二进制输出数字的程序图解和代码解释
先運行一下;
按二進制輸出了十六進制的07h;
十六進制07,?
轉換為二進制是 111;4 + 2 + 1 = 7;?
; print result in binary: mov bl, 09h mov cx, 8 print: mov ah, 2mov dl, '0'test bl, 10000000b; test first bit.jz zeromov dl, '1' zero: int 21hshl bl, 1 loop print ; print binary suffix: mov dl, 'b' int 21h?首先把要輸出的數字放入bl;
把8放入cx,這個是循環次數;8位二進制數字每次輸出一個;
把2放入ah,
int 21h,ah = 02 子功能,其功能是顯示輸出,要輸出的字符放在dl寄存器中;
把 0 放入 dl;
比較bl和二進制的 10000000;
如果為零,跳到 zero 處;
如果非零,把 1 放入 dl;
這樣就把每次要輸出的1或0放入了dl;
?
匯編test指令:
Test命令將兩個操作數進行邏輯與運算,并根據運算結果設置相關的標志位。
Test命令的兩個操作數不會被改變。
Test對兩個參數(目標,源)執行AND邏輯操作,并根據結果設置標志寄存器,結果本身不會保存。
TEST AX,BX 與 AND AX,BX 命令有相同效果,只是Test指令不改變AX和BX的內容,而AND指令會把結果保存到AX中。
?
intel對test指令的描述如下:
TEMP ←SRC1 AND SRC2;
SF ←MSB(TEMP);
IF TEMP = 0
THEN ZF ←1;
ELSE ZF ←0;
FI:
PF ←BitwiseXNOR(TEMP[0:7]);
CF ←0;
OF ←0;
(* AF is undefined *)
test運用舉例
1.
test eax,100b;b后綴意為二進制
jnz ******;如果eax右數第三個位為1,jnz將會跳轉
2.Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設置ZF零標志為1,jz跳轉。
test后一般跟跳轉指令;
?
然后執行 int 21h,輸出了dl中的字符;
然后把bl內容左移一位;下次循環測試下一位是輸出1還是0;
?
匯編shl指令:
SHL是一個匯編指令,作用是邏輯左移指令,將目的操作數順序左移1位或CL寄存器中指定的位數。左移一位時,操作數的最高位移入進位標志位CF,最低位補零。
?
如此循環8次,輸出每一位的1或0;
最后把字符'b'放入dl,輸出此字符,二進制的結尾標志;
?
再輸出一次;
十六進制9;
轉換為二進制是1001; 2^3=8, 8+1=9;?
看一下輸出結果,沒有錯;?
?
總結
以上是生活随笔為你收集整理的80x86汇编按二进制输出数字的程序图解和代码解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux安装mysql学习
- 下一篇: NASM汇编helloworld图解