20CN网络安全小组第一代论坛
发表新主题  发表回复

个人资料 | 社区目录 用户登录 | | 论坛搜索 | 常见问题 | 论坛主页
  下一个最老的主题   下一个最新的主题
» 20CN网络安全小组第一代论坛   » 电 脑 技 术   » 编程破解   » 学习汇编的好帮手(第十篇)

   
作者 标题: 学习汇编的好帮手(第十篇)
第007元素
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
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),使得结果显示的十六进位数不会盖
 掉原先输入的十进位数。

IP: 已记录

 
发表新主题  发表回复 关闭主题 突出主题 移动主题 删除主题 下一个最老的主题   下一个最新的主题
 - 适于打印的主题视图
转到:
联系我们 | 20CN网络安全小组

Powered by Infopop Corporation
UBB.classic™ 6.5.0
NetDemon修改版 1.5.0, 20CN网络安全小组 版权所有。