📄 80386asm程序设计基础(八).htm
字号:
ebx
|<BR> | mov
cx,1
|<BR>
|hex3:
| <BR> | mov
al,[ebp-countb+ebx]
|<BR> | inc
ebx
|<BR> | call
toasc
|<BR> | call
echo
|<BR> | loop
hex3
|<BR> |
leave
|<BR> |
ret
|<BR> |tohex
endp
|<BR>
|------------------------------------------------------------|
<BR>
分析:该子过程的功能是将f000:1234双字单元的内容以16进制数显示出来,首先来考虑一下将一个数以16进制数表示出来的算法,事实上在汇编语言中操作数一直都是以十六进制表示的。因此,在这个子过程中不可以像上一个子过程一样,通过不断的除法取模得到结果。事实上,我们只需要将32位操作,以每半个字节(四位)的内容显示出来就可以了,有了这一编程思想,就很容易看懂上面的子过程。当然你们会问,为什么要每次只显示半个字节而不显示一个字节呢?呵呵,十六进制的十六个数是从0000-1111,不就是半个字节了。所以要循环8次才可以显示出32位的EAX,所以这里用ror指令来不断循环移位,每次右移4位放到dl的低4位中。这8个半字节分别放在[ebp-1]至[ebp-8]的存储单元中。不过,存储的顺序是由低位到高位,如果就这样显示结果肯定显示反了。标号hex2,hex3的主要功能是用来判断f000:1234双字单元的内容是否为0,如果为0,只需要将最后结果显示一个0即可,否则就显示出8位内容。下面是每条指令的功能:<BR>
b1.countb=8;伪指令定义一局部变量countb,其值为8<BR> b2.enter
countb,0;建立堆栈框架指令<BR> b3.movzx
ebp,bp;对bp进行零扩展<BR> b4.mov
ecx,countb;8=>ecx<BR> b5.mov
edx,eax;将eax=>edx<BR> b6.mov al,dl<BR>
b7.and al,0fh;取低4位<BR> b8.mov
[ebp-countb+ecx-1],al;将8个半字节的内容逐一送到[ebp-1]至[ebp-8]的内存单元中<BR>
b9.ror edx,4;对edx进行循环右移,每次移动4位<BR> b10.loop
hex1<BR> b11.mov cx,countb<BR> b12.xor
ebx,ebx;ebx清0<BR> b13.cmp byte ptr
[ebp-countb+ebx],0;下面的语句主要用来判断源操作数f000:1234的内容是否为0,如果是0,就在屏幕上只显示一个0<BR>
b14.jnz hex3<BR> b15.inc ebx<BR> b16.loop
hex2<BR> b17.dec ebx<BR> b18.mov
cx,1<BR> b19.mov
al,[ebp-countb+ebx];逐一显示[ebp-8]到[ebp-1]的内容。<BR> b20.inc
ebx<BR> b21.call toasc<BR> b22.call
echo<BR> b23.loop hex3<BR>
b24.leave;释放堆栈框架<BR> b25.ret<BR>
<BR> c.子过程tobin<BR>
|---------------------------------------|<BR> |tobin
proc
near |<BR>
| push
eax |<BR>
| push
ecx |<BR>
| push
edx |<BR>
| bsr
edx,eax |<BR>
| jnz
bin1 |<BR>
| xor
dx,dx |<BR>
|bin1: |<BR>
| mov
cl,31 |<BR>
| sub
cl,dl |<BR>
| shl
eax,cl |</P>
<P> | mov
cx,dx
|<BR> | inc
cx <BR>
| mov
edx,eax
|<BR>
|bin2: </P>
<P> | rol
edx,1 <BR>
| mov
al,'0' <BR>
| adc
al,0 <BR>
| call
echo <BR>
| loop
bin2 <BR>
| pop
edx |<BR>
| pop
ecx <BR>
| pop
eax <BR>
|
ret <BR>
|tobin
endp <BR>
|---------------------------------------|<BR>
分析:将一个数用二进制数显示出来,只需要用ROL指令就可以了。这里作者写的程序就是这个思路,在标号bin1中主要判断f000:1234单元的内容是否为0,如果为0,那么只需要在屏幕上显示一个0就可以了。否则的话,就用ROL指令对源操作数移位32位,从最高位31位到最低位逐一显示出来,程序设计思路很简单,没有什么复杂的算法,下面看每一条指令的含义:<BR>
c1.push eax;eax入栈<BR> c2.push ecx;ecx入栈<BR>
c3.push edx;edx入栈<BR> c4.bsr
edx,eax;对eax进行扫描,并把第一个为1的位号送给edx<BR> c5.jnz
bin1;如果eax不为0,就跳到c7去执行<BR> c6.xor
dx,dx;如果eax为0,就将dx清0<BR> c7.mov
cl,31;从c7到c12主要用来设置计数器cx,如果eax=0,那么就设置cx=1,如果eax不等于0,那么就设置ecx=32<BR>
c8.sub cl,dl<BR> c9.shl eax,cl<BR> c10.mov
cx,dx<BR> c11.inc cx<BR> c12.mov
edx,eax<BR> c13.rol
edx,1;从c13到c15主要用来显示二进制数据,顺序是从最高位31位到最低位0位<BR> c14.mov
al,'0'<BR> c15.adc al,0<BR> c16.call
echo<BR> c17.loop bin2<BR> c18.pop
edx;edx出栈<BR> c19.pop ecx;ecx出栈<BR>
c20.pop eax;eax出栈<BR> c21.ret<BR>
在后续的篇幅里将主要介绍保护式下的段页管理机制及及如何在保护模下编程。<BR></P><BR><!--内容结束//--></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><!--文章评论开始//-->
<TABLE cellSpacing=0 cellPadding=0 width=770 align=center bgColor=#006699
border=0>
<TBODY>
<TR bgColor=#006699>
<TD id=white align=middle bgColor=#006699><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle><!--文章人气开始//-->
<SCRIPT src="80386ASM程序设计基础(八).files/readnum.htm"></SCRIPT>
<!--文章人气开始//--></TD></TR></TBODY></TABLE><!--文章评论结束//--><BR>
<DIV align=center>
<TABLE cellSpacing=1 cellPadding=2 width=770 align=center bgColor=#cccccc
border=0>
<TBODY>
<TR>
<TH id=white bgColor=#006699><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE width=770 border=0>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=17350">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR width=770 noShade SIZE=1>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR align=middle>
<TD vAlign=bottom height=10><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
height=48 src="80386ASM程序设计基础(八).files/biaoshi.gif" width=40
border=0></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -