信區 : 破解網-破解技術討論區
日期 : 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
沒有留言:
張貼留言