※ 利用旋转指令 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),使得结果显示的十六进位数不会盖
掉原先输入的十进位数。