📄 80386asm程序设计基础(八).htm
字号:
<TD colSpan=3 height=1></TD></TR></TBODY></TABLE>
<TABLE width=770 border=0>
<TBODY>
<TR>
<TD class=td1 vAlign=top align=middle width=150 bgColor=#fafafa><BR><!--广告条开始//-->
<SCRIPT src="80386ASM程序设计基础(八).files/other.js"></SCRIPT>
<!--广告条结束//--></TD>
<TD align=middle width=620><!--文章说明信息开始//-->
<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#eeeeee border=0>
<TBODY>
<TR bgColor=#ffffff>
<TD align=middle width=50 height=10></TD>
<TD align=right><A href="http://www.csdn.net/">CSDN</A> - <A
href="http://www.csdn.net/develop/">文档中心</A> - <FONT
color=#003399>其他开发语言 </FONT> </TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>标题</FONT></TD>
<TD><B> 80386ASM程序设计基础(八)</B> kingcaiyao(原作)
</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500> 80386ASM</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE width=600 border=0>
<TBODY>
<TR>
<TD align=left><!--内容开始//--><BR>
<P> 80386实模式下编程<BR> 80386在实模式下是一个更快的8086,它不但可以进行32位操作,而且还可以进32位寻址,并且还可以使用80386的扩展指令。不过,由于是在实模下,寻址的最大空间为1M。在一个段内,段的最大长度不超过64K,否则就会发生异常。<BR> 在8086下定义一个段的完整格式是:<BR> 段名
[定位类型] [组合类型]
[‘类别’]<BR> 80386下定义一个段的完整格式是:<BR> 段名 [定位类型]
[组合类型] [‘类别’]
[属性类型]<BR> 说明:属性类型有两种:USE32和USE16,USE32表示32位段,USE16表示16位段。如果你在程序中用到伪指令.386,那么默认的属性类型就是USE32(32位段),如果没有用伪指令指定CPU的类型,那么默认的属性类型就是USE16,在实方式下只能使用16位段,即用USE16。<BR> eg:<BR>
CSEG PARA PUBLIC USE32;定义一个32位的段<BR>
AA DW ?</P>
<P> BB DD
?<BR> CC DB
?<BR> DD DW
?<BR> EE DW
0,0,0.....<BR> CSEG
ENDS<BR> 由于在80386中用到了66H操作前缀和67H地址前缀,因此尽管在实式模式下,只要设定的CPU类型是80386,仍然可以进行32位操作,可以进行32位寻址,66H,67H这两个前缀无需程序员在程序中书写,汇编程序会自动加上的。只要在程序中对32位操作数进行访问,或进行32位寻址,那么就会加上操作数前缀66H和地址前缀67H。相反,如果在32位段中对16位或8位的访问,汇编程序中也会加上这两个前缀。<BR>
下面将给出一个例子程序,演示一下在80386的实模式下编程的方法与技巧(这是从网上down的一个程序,不是我写的,但我会作详细的解剖,并与8086下的程序设计作出比较):<BR>
用十进制,十六进制,二进制三种形式显示双字存储单元F000:1234中的内容<BR>
|------------------MAIN PROC------------|<BR> |
.386 |<BR>
| code segment para public 'code' use16 |<BR>
| assume
cs:code |<BR>
|
begin: |<BR>
| mov
ax,0f000h |<BR>
| mov
fs,ax
|<BR> | mov
eax,fs:[1234H]
|<BR> | call
todec
|<BR> | call
newline
|<BR> | call
tohex |<BR>
| mov
al,'H' |<BR>
| call
echo |<BR>
| call
newline |<BR>
| call
tobin |<BR>
| mov
al,'B' |<BR>
| call
echo |
<BR> | call
newline |
<BR> | mov
ah,4ch |<BR>
| int
21h |<BR>
|---------------------------------------|
<BR> ;sub-function todec<BR>
todec proc near<BR>
pushad<BR> mov
ebx,10<BR> xor
cx,cx<BR>
dec1:<BR> xor
edx,edx<BR> div
ebx<BR> push
dx<BR> inc
cx<BR> or
eax,eax<BR> jnz
dec1<BR>
dec2:<BR> pop
ax<BR> call
toasc<BR> call
echo<BR> loop
dec2<BR>
popad<BR> ret<BR>
todec endp <BR> <BR> ;sub-function
tobin<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<BR> mov
cx,dx<BR> inc
cx<BR> mov
edx,eax<BR>
bin2:<BR> 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</P>
<P> ;sub-function tohex<BR> tohex proc
near<BR>
countb=8<BR> enter
countb,0<BR> movzx
ebp,bp<BR> mov
ecx,countb<BR> mov
edx,eax<BR> hex1:<BR> mov
al,dl<BR> and
al,0fh<BR> mov
[ebp-countb+ecx-1],al<BR> ror
edx,4<BR> loop
hex1<BR> mov
cx,countb<BR> xor ebx,ebx<BR>
hex2:<BR> cmp byte ptr
[ebp-countb+ebx],0<BR> jnz
hex3<BR> inc ebx<BR>
loop hex2<BR> dec
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> ;sub-function
toasc<BR> toasc proc near<BR> and
al,0fh<BR> cmp
al,'0'<BR> cmp
al,'9'<BR> seta
dl<BR> movzx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -