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