图解在emu8086中学习汇编语言数字比较程序
打開emu8086,運(yùn)行自帶實(shí)例,數(shù)字比較程序;運(yùn)行情況如下;
程序如下;
? ? 此示例,前面是些cmp語句的用法示例;正式程序從 game: 標(biāo)號開始;程序結(jié)構(gòu)如下;
? ? msg1 定義字符串,提示用戶輸入一個字符;msg1后面是其他提示字符串定義;
? ? 調(diào)用 int 21h 的09號子功能,在屏幕顯示提示,讓用戶輸入一個字符串;
? ? 調(diào)用 int 21h 的01號子功能,從鍵盤讀入一個字符到al;
? ? 比較al 和 5,然后根據(jù)比較結(jié)果,分別執(zhí)行 jb、ja,或執(zhí)行 mov dx, offset equal_5;
? ? 在屏幕輸出比較結(jié)果;
? ? 等待輸入下一個字符;
?
? ? 下面先復(fù)習(xí)一下匯編CMP指令;
CMP(比較)指令執(zhí)行從目的操作數(shù)中減去源操作數(shù)的隱含減法操作,并且不修改任何操作數(shù):
CMP destination,source
標(biāo)志位
當(dāng)實(shí)際的減法發(fā)生時,CMP 指令按照計算結(jié)果修改溢出、符號、零、進(jìn)位、輔助進(jìn)位和奇偶標(biāo)志位。
如果比較的是兩個無符號數(shù),則零標(biāo)志位和進(jìn)位標(biāo)志位表示的兩個操作數(shù)之間的關(guān)系如下:
? ? CMP結(jié)果? ? ? ? ? ? ? ? ? ? ? ? ZF ? ? ? CF
? ? 目的操作數(shù) < 源操作數(shù)?? ?0? ? ? ? 1
? ? 目的操作數(shù) > 源操作數(shù)?? ?0? ? ? ? 0
? ? 目的操作數(shù) = 源操作數(shù)?? ?1? ? ? ? 0
CMP指令執(zhí)行減法,不會改變源和目的操作數(shù),影響標(biāo)志位;
匯編cmp指令參閱此;
? ? ? ??http://c.biancheng.net/view/3561.html
?
在 070 行下一個斷點(diǎn),從debug菜單執(zhí)行 run until;
? ? 看一下此時,ah是前面語句設(shè)置的子功能號09,DX是msg1的偏移地址;
再往下,運(yùn)行到需要鍵盤輸入字符時,停住如下;
?
輸入一個字符,比較后輸出結(jié)果;運(yùn)行到 071 行又停住,等待再次輸入字符;
在 080 行下斷點(diǎn),即選中 080 行,從debug菜單執(zhí)行run until;輸入字符6,運(yùn)行到80行停住,如下;
? ? 此時ah是01h,這是070行設(shè)置的子功能號,沒錯;
? ? al是36h;沒搞清,al此時我以為應(yīng)該是從鍵盤讀入的6,應(yīng)該是06h;
從新執(zhí)行,斷在080行,鍵盤輸入8;此時al是38h,按程序來看應(yīng)該是從鍵盤讀入的08h;
單步執(zhí)行;運(yùn)行到071行,此時進(jìn)入dos系統(tǒng)空間,如下圖藍(lán)色選中片區(qū)所示,還未返回到用戶程序的 071 行;
? ? 此時al自己會變?yōu)?4h;不知為何;此時鍵盤字符還未讀入到al;
? ? 這個好像是系統(tǒng)自己設(shè)置的;用戶程序不會用到;
重新執(zhí)行;每次都是如此;這個al的24h可能是系統(tǒng)自己用的;
如果運(yùn)行到067行,如下,已經(jīng)從系統(tǒng)空間返回到用戶程序的067行;
? ? 此時ah是09h,是066行設(shè)置的子功能號,沒有問題;
? ? al是01h,最近一行影響到al的指令是060行,“mov al, 1”,把1放入al,沒有問題;
總結(jié)
以上是生活随笔為你收集整理的图解在emu8086中学习汇编语言数字比较程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核锁机制学习
- 下一篇: sql三表连接查询 - 使用sqlite