2011年5月22日 星期日

MASM_10

信區 : 破解網-破解技術討論區

日期 : Wed May 15, 12:25                                                      
來自 : Jerry Cls                                               39:40/103
給   : All                                
標題 : asm10                                                                
--------------------------------------------------------------------------------

@TID: FastEcho 1.40 17014


binihex segment         ;start of segment
        assume cs:binihex
        mov  ch,4       ;number of digits
rotate: mov  cl,4       ;set count to 4 bits
        rol  bx,cl      ;left digit to right
        mov  al,bl      ;move to AL
        and  al,0fh     ;mask off left digit
        add  al,30h     ;convert hex to ASCII
        cmp  al,3ah     ;is it > 9
        jl   printit    ;jump if digit = 0 to 9
        add  al,7h      ;digit is A to F
printit:mov  dl,al      ;put ASCII char in DL
        mov  ah,2       ;Display Output Finct
        int  21h        ;call DOS
        dec  ch         ;done 4 digits ?
        jnz  rotate     ;not yet
        int  20h        ;return from binihex
binihex ends            ;end of segment
        end

※  利用旋轉指令 ROL 旋轉暫存器 BX 的內容,以便依序處理 4
    個十六進位數:
1.利用 CL 暫存器當計數器,記錄暫存器移動的次數。
2.將 BX 的第一個十六進位值移到最右邊。

※  利用 AND 指令(兩個運算元都為1時,其結果方為1)配合
  『遮罩,Mask』來遮掉不要的部份,以得到單純的結果:
1.先將 BL 值存入 AL 中,再以 0Fh (00001111)為遮罩 。
2.利用 AND 特性將 AL 的左邊四個位元給遮掉。

※  由於字元0~9之 ASCII 值為 30h~39h,而A~F之 ASCII
    值為 41h~46h,其中相差 7,所以得到的結果為:若 AL 之
  內容小於 3Ah,則 AL 值只加 30h,否則 AL 值得再加 7h。
※  ADD 指令會將兩個運算元相加,其結果存於左邊的運算元內。

※  旗標是只有一個位元的暫存器,集合成一個單獨的十六位元
  暫存器,稱為『旗標暫存器,Flag Register』。
※  某些組合語言指令(大部份是那些涉及比較、算術或邏輯運
  算的指令)執行時,會將相關旗標設定(1)或清除(0)。

※  您經常會碰到的旗標是零值旗標(ZR/NZ)、正負號旗標(NG
  /PL)、溢位旗標(OV/NV)和進位旗標(CY/NC)。
※  旗標保存了某個指令執行的結果,可用其他相關指令,查出
  發出的情況,藉以因應而產生相對動作。

※  CMP 指令的動作很像減法,是將兩個運算元的值加以比較。
※  執行後,暫存器或記憶體的內容並未改變,只是相對的旗標
  發生改變而已:若 AL 的內含值小於 3Ah,則正負號旗標會
  設定成 NG(-),反之則為 PL(+)。

※  JL 指令可直接想成『假如小於就跳越,Jump if Less than』
  到運算元欄所指定的記憶位置。
※  CMP 指令和 JG 、JL 等條件式跳越指令一起使用,可以形成程
  式的『分支,branch』結構,是撰寫組合語言程式常用的技巧。

※ 『JNZ,Jump if Not Zero』指令,其功能為當零值旗標未設定
  ,則跳到運算元所指定的記憶位址。

※  第二個模組 DECIBIN 用來接收鍵盤打入的十進位數,並將它轉
  換成二進位數放於 BX 暫存器中,供 BINIHEX 程式使用。
※  此程式之流程及程式碼並不困難, 您是否已有腹案了?

decibin segment
        assume cs:decibin
        mov  bx,0       ;clear BX for number
newchar:mov  ah,1       ;keyboard input
        int  21h        ;call DOS
        sub  al,30h     ;ASCII to binary
        jl   exit       ;jump if < 0
        cmp  al,9d      ;is it > 9d ?
        jg   exit       ;yes, not dec digit
        cbw     ;byte in AL to word in AX
        xchg ax,bx      ;trade digit & number
        mov  cx,10d     ;put 10 dec in CX
        mul  cx         ;number times 10
        xchg ax,bx      ;trade number & digit
        add  bx,ax      ;add digit to number
        jmp  newchar    ;get next digit
exit:   int  20         ;return from decibin
decibin ends            ;end of decibin proc
        end

※  減法指令 SUB 會將左邊的運算元減去右邊的運算元,結果存
  於左邊的運算元中。

※  JG 指令與 CMP 指令配合,若 CMP 指令左邊運算元大於右邊
  運算元,則跳至其本身運算元指定的記憶體位址。

※  CBW 指令會把 AL 暫存器中的位元組(8 位元 )轉換成字組
(16 位元 ),並放於 AX 暫存器中。
※  實際上的結果是:
『若 AL 中的值為正,則 AH 填入 00h;反之,則 AH 填入 FFh』

※  XCHG 指令會把兩個運算元的內含值互換。
※  常用於需要暫時保留某個暫存器中的內含值時。

※  MUL 指令會將運算元的內含值與A暫存器的內容相乘,並將
  結果存於A暫存器中。

※  當然,我們還得加一個 CRLF 的小程式,用來列印歸位字元
(CR)與換列字元(LF),使得結果顯示的十六進位數不會蓋
  掉原先輸入的十進位數。 


--- SuperBBS 1.17 (Reg)
 * Origin: BEAR BBS OPEN:24HR  TEL : (02)377-6746 (39:40/103)
PATH: 40/103 100

沒有留言:

張貼留言