初学的朋友往往会问怎样“区分”无符号数和带符号数,其实两者在形式上是没有区别的,区别就在你的心里:如果你将某二进制数的最高位视为符号位,就是带符号数;如果将其看作是一个有效数位而不是符号位,则为无符号数。
比如0fdh,如果将最高位视为有效数位,则0fdh就是无符号数,即253;如果最高位视为符号位,它就是一个带符号数,并且是个负数;而在计算机内部,负数都用补码表示,所以将0fdh看作负数时,它就是某个负数的补码:
0fdh=11111101b
将其按数值位“各位取反、末位加1”的法则转换成原码则是:
10000011b
这就是0fdh的原码-3。
...
- [游客] 说的不错,但是现在国人能有多少个学习这个的时候还能有开拓视野的想法。。。 04/08 09:13
- [scuzg] 0fch展开成二进制数: 11111100,其中最高位是符号位,所以: 7ch+4=80h=12 12/20 19:05
- [842460904] 理论是应该负数原码和补码数值之和等于128,可为什么。fc和它的补码-4相加,即252+(-4)=? 09/03 23:38
- [fpamc] 顶顶…… 05/25 09:49
- [scuzg] 20位,图中有说明。 12/29 15:45
- [scuzg] 表示8位二进制数的16进制数fdh,因高位是f,所以前面前缀0以区别于标识符,也就是说,当对应8位二 12/29 15:42
- [powerofthinking] 博主的文章不错,希望再多写几篇。 12/18 13:40
- [游客] 请问0fdh为什么不是0000 1111 1101 b ?如果最高位视为符号位,它就是一个带符号数, 12/17 23:08
- [游客] 请问scuzg老师,地址加法器是多少位的啊(物理连接结构)?寄存器是16位,地址线20位,地址加法器 12/17 23:02
- [游客] 地址译码逻辑是不是应该在CPU内部啊? 我也觉得文章有点问题,还有就是看了scuzg老师很多文章, 12/17 22:59
- [qqqun238564439] 厉害 04/10 10:57
- [suixin] 少了个你,呵呵 “看着你的回答真长见识” 12/01 09:31
- [suixin] 看着的回答真长见识 12/01 09:29
- [fangorc] 先弄个友情链接,老师这的好东西太多了,慢慢消化~ 08/07 22:03
- [zdpopup] 谢谢scuzg 的宝贵意见,我看了2次你的话 08/05 01:43
- [游客] 过来踩踩。哈哈!端他爸 08/03 11:28
[2010-07-02 09:38] 怎样“区分”带符号数和无符号数?
阅读全文 |
评论次数(7) |
浏览次数(1845) |
所属类型(汇编语言)
[2009-12-29 00:04] 通过反汇编代码解读指针和引用的内在机理
试图用中文、英文等自然语言将 C++ 的指针和引用的异同描述得简练、通透是一件困难的事情,而阅读包含指针和引用的反汇编代码是一个好办法:这绝对是一种无二义性和尽可能简练的陈述。
比如下述代码
void main(void)
{
int x1=0,*ptrx1=&x1;
int x2=0,&refx2=x2;
(*ptrx1)++; //关注对变量的操作
refx2++;
printf("x1=%d,x2=%d\n",x1,x2);
}
执行后,通过指针及引用对变量的间接操作使 x1 和 x2 都增加了 1 ,不...
比如下述代码
void main(void)
{
int x1=0,*ptrx1=&x1;
int x2=0,&refx2=x2;
(*ptrx1)++; //关注对变量的操作
refx2++;
printf("x1=%d,x2=%d\n",x1,x2);
}
执行后,通过指针及引用对变量的间接操作使 x1 和 x2 都增加了 1 ,不...
阅读全文 |
评论次数(0) |
浏览次数(997) |
所属类型(汇编语言)
[2009-10-26 08:27] 我们的手指和二进制数(位串、位序列)
存储于计算机内的各种二进制数,严格意义上应该称作二进制位串(或位序列),这些二进制位串可能是数,也可能是编码(比如ASC码、汉字内码等)或机器指令。
用简单的二进制位串表现内涵迥异的内容是我们不熟悉和容易迷惑的,但想想我们的手指就会感到释然:手指不仅可以表示数,也可以表示OK、WC、“你真棒”、“石头、剪子、布”、证券交易所、特警突击队以及划拳用的手势等。
面对一个孤立的二进制位串,我们是无法确定它究竟是数、是码还是指令的。比如一个目标程序,其内容显然是机器代码,但当对该程序进行传送或加密处理时,这些代码就成了被其他程序处理的数据。这和我们的手势又很类似:竖起食指和中指,可...
用简单的二进制位串表现内涵迥异的内容是我们不熟悉和容易迷惑的,但想想我们的手指就会感到释然:手指不仅可以表示数,也可以表示OK、WC、“你真棒”、“石头、剪子、布”、证券交易所、特警突击队以及划拳用的手势等。
面对一个孤立的二进制位串,我们是无法确定它究竟是数、是码还是指令的。比如一个目标程序,其内容显然是机器代码,但当对该程序进行传送或加密处理时,这些代码就成了被其他程序处理的数据。这和我们的手势又很类似:竖起食指和中指,可...
阅读全文 |
评论次数(4) |
浏览次数(1767) |
所属类型(汇编语言)
[2009-09-27 20:53] 存储器寻址小议(三):存储器寻址方式和常量、变量及“准指针”
CPU 获得操作数的方式叫作寻址方式。
和计算机三个核心部件(CPU、存储器和I/O接口)相对应,寻址方式自然地分成了(CPU内部的)寄存器寻址、存储器寻址和I/O接口寻址。
由于 CPU 的寄存器数量极少,所以寻址方式非常简单;而实现计算机内核和外设间数据交换的 I/O 接口的寻址也没有复杂的必要,所以这两类寻址方式是很容易学习和掌握的;为管理大容量内存,便于组织串、数组等结构复杂的数据处理,存储器必须具有更灵活、也就相对复杂的寻址方式。
通过上一单元的讨论我们知道,8086/8088 CPU 的物理地址是由逻辑地址间接给出的。逻辑地址的段基址部分直接用通用寄存...
和计算机三个核心部件(CPU、存储器和I/O接口)相对应,寻址方式自然地分成了(CPU内部的)寄存器寻址、存储器寻址和I/O接口寻址。
由于 CPU 的寄存器数量极少,所以寻址方式非常简单;而实现计算机内核和外设间数据交换的 I/O 接口的寻址也没有复杂的必要,所以这两类寻址方式是很容易学习和掌握的;为管理大容量内存,便于组织串、数组等结构复杂的数据处理,存储器必须具有更灵活、也就相对复杂的寻址方式。
通过上一单元的讨论我们知道,8086/8088 CPU 的物理地址是由逻辑地址间接给出的。逻辑地址的段基址部分直接用通用寄存...
阅读全文 |
评论次数(1) |
浏览次数(1168) |
所属类型(汇编语言)
[2009-09-23 21:49] 存储器寻址小议(二):8086/8088的物理地址、段机制和逻辑地址
为寻址(或管理、使用)1M 字节的存储空间,8086/8088 CPU 设计有 20 条地址线。这 20 条地址线从全 0 到全 1 的 1M 种状态通过驱动地址译码逻辑,即可寻址 1M 字节的内存。
这从全 0 到全 1 的每一个二进制数,很自然地可以作为内存字节单元的编号,即地址;由于使用这种地址能直接控制地址译码器在物理上唯一地选通某个字节单元,故被称做“物理地址”。
程序是不能直接给出 20 位地址信息的,这是因为 8086/8088 CPU 可编程的 14 个寄存器都是 16 位的,更没有通过编程直接输出20 位地址信息的其他途径。20 位地址输出是通过来自段寄存...
这从全 0 到全 1 的每一个二进制数,很自然地可以作为内存字节单元的编号,即地址;由于使用这种地址能直接控制地址译码器在物理上唯一地选通某个字节单元,故被称做“物理地址”。
程序是不能直接给出 20 位地址信息的,这是因为 8086/8088 CPU 可编程的 14 个寄存器都是 16 位的,更没有通过编程直接输出20 位地址信息的其他途径。20 位地址输出是通过来自段寄存...
阅读全文 |
评论次数(8) |
浏览次数(3456) |
所属类型(汇编语言)
[2009-09-23 15:43] 存储器寻址小议(一):存储单元定位和地址译码
在上图“地址译码逻辑”右侧,有和内存单元字节数相等的“字节单元选择线”和每一字节单元连接,CPU 访问内存某个字节时,只有一个字节单元受“字节单元选择线”的控制处于和数据线连接的状态,这就是内存单元的定位(如果是字访问方式,将会是两个相邻的字节单元和数据线相连)。
直接从 CPU 引出和内存字节数相等的“地址选择线”来访问内存是不可能的,通常采用“地址译码器”来实现用少量地址线对大量字节单元的定位——即寻址。我们假设上图 CPU 用 8 根地址线连接地址译码逻辑,那么 8 根地址线就可以组合出 0~255 一共 256 种状态,这些二进制数的 0 和 1 在计算机里就是开关电路的状态...
直接从 CPU 引出和内存字节数相等的“地址选择线”来访问内存是不可能的,通常采用“地址译码器”来实现用少量地址线对大量字节单元的定位——即寻址。我们假设上图 CPU 用 8 根地址线连接地址译码逻辑,那么 8 根地址线就可以组合出 0~255 一共 256 种状态,这些二进制数的 0 和 1 在计算机里就是开关电路的状态...
阅读全文 |
评论次数(4) |
浏览次数(1633) |
所属类型(汇编语言)
[2009-08-10 22:18] 汇编语言源程序框架结构和格式规范
作为符号化机器语言及受段结构的影响,汇编语言源程序的结构和可读性都无法和高级语言相比。不过把汇编语言源程序共有的元素剥离出来,并稍加整理和熟悉,会发现情况会比先前清晰很多。
汇编语言源程序大致包含下列 6 个“框架”元素:
;①容量足够且固定的“通用”堆栈段:
stck segment stack 'stack'
;80H的栈深度足以应付一般应用程序对堆栈的需求
dw 80h dup(0)
stck ends
;②空数据段
data segment
data ends
...
汇编语言源程序大致包含下列 6 个“框架”元素:
;①容量足够且固定的“通用”堆栈段:
stck segment stack 'stack'
;80H的栈深度足以应付一般应用程序对堆栈的需求
dw 80h dup(0)
stck ends
;②空数据段
data segment
data ends
...
阅读全文 |
评论次数(7) |
浏览次数(2044) |
所属类型(汇编语言)
[2009-08-10 12:41] 类似DOS功能调用09H的字符串显示子程序
DOS功能调用09H是实现字符串显示的软中断。该功能调用除不能指定显示位置及显示属性(前景色、背景色及是否闪烁)外,实现机理对初学者来说也是个“黑箱”。
本文所述的字符串显示子程序,能“在指定位置、以指定属性显示指定的字符串”。由于这个子程序不依赖任何系统功能调用,所以能让我们看清楚字符串显示的内在机理。
大家都知道计算机的显卡,它是在计算机的统一调度下完成显示的重要部件。显卡包含显示芯片和显示缓存,显示芯片是专司显示的协处理器,显示缓存是主机CPU和显示芯片都可以对其进行访问的“双口存储器”。字符显示的机理其实很简单:CPU 将要显示字符的ASC码及显示属性送入和指定显示...
本文所述的字符串显示子程序,能“在指定位置、以指定属性显示指定的字符串”。由于这个子程序不依赖任何系统功能调用,所以能让我们看清楚字符串显示的内在机理。
大家都知道计算机的显卡,它是在计算机的统一调度下完成显示的重要部件。显卡包含显示芯片和显示缓存,显示芯片是专司显示的协处理器,显示缓存是主机CPU和显示芯片都可以对其进行访问的“双口存储器”。字符显示的机理其实很简单:CPU 将要显示字符的ASC码及显示属性送入和指定显示...
阅读全文 |
评论次数(3) |
浏览次数(2307) |
所属类型(汇编语言)
[2009-07-30 14:56] 汇编语言的常量、变量及其与寻址方式的关系
我感觉仅仅停留在文字上阐述和理解汇编语言的常量和变量是一件麻烦事,而通过分析常量、变量定义和引用语句的反汇编代码,会发现问题其实非常简单。
假设常量、变量的定义及引用语句如下:
;数据段常量和变量定义语句
fctr equ 1218h
x db 1
y db 2
;代码段常量和变量引用语句
mov ax,fctr
mov bl,x
add bl,y
对应的反汇编代码如是:
;数据段目标代码
1475:0000 01 02
;代码段目标代码
1476:0005 B81812 MOV AX,1218
1476:0008 8A1E...
假设常量、变量的定义及引用语句如下:
;数据段常量和变量定义语句
fctr equ 1218h
x db 1
y db 2
;代码段常量和变量引用语句
mov ax,fctr
mov bl,x
add bl,y
对应的反汇编代码如是:
;数据段目标代码
1475:0000 01 02
;代码段目标代码
1476:0005 B81812 MOV AX,1218
1476:0008 8A1E...
阅读全文 |
评论次数(5) |
浏览次数(1113) |
所属类型(汇编语言)
[2009-07-23 17:49] 计算机认识的数和汇编语言认识的数
在学习汇编语言时,常常会提到,计算机只能接受和识别二进制数,但在介绍汇编语言的数据类型时,又会发现汇编语言和其他高级语言一样,能接受常用进制数、浮点数、字符串等。需要注意的是,尽管汇编语言是最接近底层的计算机语言,但它还是具有一些基本的翻译功能,不要把计算机认识的数的能力和汇编语言认识的数的能力相混淆。汇编语言能认识多种进制数、浮点数、字符串等,是汇编语言编译程序的功能,计算机是不能直接识别和接受的。上述多种数据类型在程序编译成机器码时也被转换成对应的二进制数了,所以计算机才能识别和接受。
另外存储于计算机内的各种二进制数,严格意义上应该称作二进制位串(或位序列),这些二进制位串可能...
另外存储于计算机内的各种二进制数,严格意义上应该称作二进制位串(或位序列),这些二进制位串可能...
阅读全文 |
评论次数(3) |
浏览次数(806) |
所属类型(汇编语言)