⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter8.htm

📁 win32汇编资料 教程!
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<Title>8.0-关于数的一些事情</Title>
<LINK REL="stylesheet" HREF="css/basestyles.css" TYPE="text/css">
<LINK REL="stylesheet" HREF="css/tutorials.css" TYPE="text/css">
</HEAD>
<BODY>
<h1 align="center">Win32Asm 教程 </h1>
<TABLE ALIGN="CENTER">
			<TR>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20"><A HREF="chapter7.htm">前一章</A></TD>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20">
				<A HREF="contents.htm">目录</A></TD>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20"><A HREF="chapter9.htm">下一章</A></TD>
			</TR>
</TABLE>
<h2>8.0-关于数的一些事情</h2>
<p>
在大多数的编程语言中使用整数还是浮点数只取决于变量的声明。在汇编语言中,完全的不同。浮点数的计算是由特别的伪代码和FPU协处理器(浮点单元)完成的。浮点指令将会在后面讨论。先来看看一些关于整数的事情。在c语言中有signed(有符号)整数和unsigned(无符号)整数。Signed是意为数有符号(+或-)。Unsigned总是正。找出下表中的不同(再一次的,这是一个byte的例子,它在其他大小时也同样工作)。
</p>
<table>
<tr>
<td class="general2">值</td>
<td class="general3" width="6%">00</td>
<td class="general3" width="6%">01</td>
<td class="general3" width="6%">02</td>
<td class="general3" width="6%">03</td>
<td class="general3" width="6%">...</td>
<td class="general3" width="6%">7F</td>
<td class="general3" width="6%">80</td>
<td class="general3" width="6%">...</td>
<td class="general3" width="6%">FC</td>
<td class="general3" width="6%">FD</td>
<td class="general3" width="6%">FE</td>
<td class="general3" width="6%">FF</td>
</tr>
<tr>
<td class="general2">无符号意义</td>
<td class="general3">00</td>
<td class="general3">01</td>
<td class="general3">02</td>
<td class="general3">03</td>
<td class="general3">...</td>
<td class="general3">7F</td>
<td class="general3">80</td>
<td class="general3">...</td>
<td class="general3">FC</td>
<td class="general3">FD</td>
<td class="general3">FE</td>
<td class="general3">FF</td>
</tr>
<tr>
<td class="general2">有符号意义</td>
<td class="general3">00</td>
<td class="general3">01</td>
<td class="general3">02</td>
<td class="general3">03</td>
<td class="general3">...</td>
<td class="general3">7F</td>
<td class="general3">-80</td>
<td class="general3">...</td>
<td class="general3">-04</td>
<td class="general3">-03</td>
<td class="general3">-02</td>
<td class="general3">-01</td>
</tr>
</table>
<p>
因此,在有符号数中,一个byte被分为两段:0~7F用于正值。80~FF用于负值。对于dword值,它也一样:0~7FFFFFFFh为正,80000000~FFFFFFFFh为负,正如你可能已经注意到的一样,负值的最高位有一个集合,因为它们比80000000h大。这位被称为符号位。
</p>
<h2>3.1-有符号或无符号?</h2>
<p>
你和处理器都不能看出一个值是signed还是unsigned。好消息是对于加法和减法来说,一个数是signed还是unsigned没有关系。
</p><p>
计算:-4+9
</p><p class="def1">
FFFFFFFC+00000009=00000005(这是对的)
</p><p>
计算:5-(-9)
</p><p class="def1">
00000005-FFFFFFF7=0000000E(这也是对的,5――9=4)
</p><p>
坏消息是对于乘法,除法和比较(compare)并不是这样。因此,对于signed数有特殊的乘除伪代码:imul和idiv
</p><p>
Imul也有一个比mul好的地方在于它可以接受直接数值:
</p><p class="def2">
imul src<br/>
imul src, immed<br/> 
imul dest,src, 8-bit immed<br/>
imul dest,src
</p><p class="def2">
idiv src
</p><p>
它们几乎和mul,div一样,只是它们可以计算signed值。比较(compare)可以和unsigned一样用。但标志作不同的设置。因此,对于符号和无符号数字有不同的jump指令:
</p><p class="def2">
cmp ax, bx<br/>
ja somewhere
</p><p>
ja是一个无符号跳转指令。如果大于就跳转。考虑这个ax=FFFFh(无符号时为FFFFh,有符号时为-1)和bx=0005h(无符号时为5,有符号时为5)。由于FFFFh在无符号时比0005大,ja指令会跳转,但如果用的是jg(指一个有符号跳转):
</p><p class="def2">
cmp ax, bx<br/>
jg somewhere
</p><p>
jg指令不会跳转,因为-1不比5大。
</p><P>
只要记住这点:
</p><p>
<B>一个数字是有符号还是无符号取决于你怎样对待这个数。</B>
</p>

</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -