本节内容:不同进制数据的编码规则。
■数值数据的编码规则:二进制数、十六进制数和十进制数,以及无符号整数和有符合整数的编码规则。
■基本数据类型:编译器指定的数据类型为基本数据类型。汇编器MASM5.0指定的基本数据类型有BYTE、WORD、DWORD、DQ、DT以及由BYTE类型定义的字符串类型。
4.1.1数值数据的编码规则■二进制数:0和1
■十六进制数:
■十进制数:BCD码
●压缩的BCD码:一个字节包含两个十进制数符号,如12H。
●非压缩的BCD码:一个字节只包含一个十进制数符号,如02H。
■无符号整数和有符号整数
无符号整数编码规则:无符号整数全部都是正整数,是什么就存什么,没有符号位。
有符号整数编码规则:最高位为符号位,“0”表示正数,“1”表示负数。
■有符号数的原码、反码、补码
●原码:最高位为符号位,(“0”代表正数,“1”代表负数)其余各位为数值本身的绝对值。
●反码:
正数:反码与原码相同,这是规定。
负数:符号位为1不变,其余位对原码取反。
●补码:
正数:补码与原码相同。
负数:符号位为1不变,其余位对原码取反加1。
■符号扩展
把一个n位二进制数扩展成m位二进制数(mn)。
无符号数:最高位前扩展(m-n)个0。
有符号数:最高位前扩展(m-n)个符号位。
举例
●无符号整数:扩展0。
8位无符号数扩展为16位无符号数:
位
位
●有符号整数:采用补码方式表示,进行符号位的扩展。
例1:21的8位二进制数扩展成16位二进制数
位
位
例2:-3的8位二进制数扩展成16位二进制数
位
位
■数值数据的表示范围
n位二进制数能够表示的范围。
无符号整数范围:0~2n-1。
有符号整数范围:-2n-1~+2n-1-1。
4.1.2基本数据类型■字节byte简写db,一个字节由8位二进制数据位组成,第0位~第7位,字节类型的无符号整数表示范围0~,如果是有符号数,则数据范围是-~。一个字节足以表示一个ASCII码字符,或者一个扩展的ASCII码字符。
■字word简写dw,一个字由16位二进制数据位组成,一个字等于2个字节,第0位~第15位,由8位高字节+8位低字节组成。表示无符号数的数据范围是0~,有符号数的数据范围是-~。
■双字dword简写dd,2个字组成,双字等于4个字节,包含32位二进制位,由高16位+低16位组成,表示无符号数的数据范围0~-1,有符号数的数据范围是-~-1。
■四字qword简写dq,由2个双字组成,等于4个字或8个字节,包含64位二进制位,分高32位和低32位,表示无符号数的数据范围0~-1,有符号数的数据范围是-~-1。
■字符串,由字符构成的一个线性数组,通常每个字符用一个字节表示,有时也可以用一个字或者双字来表示。例如:ABCDEF。
4.2节字符编码规则本节内容:字符编码规则。
■字符编码规则:ASCII码、ANSI字符集、Unicode字符集。
■变形国标码:国标码是16位编码,高8位表示汉字符的区号,低8位表示汉字符的位号。
4.2.1字符编码规则计算机只能存储二进制数0和1,那么该如何表示字符呢?
■ASCII码字符
ASCII是美国国家标准信息交换码的英文缩写。每个字符由一个唯一的7位整数表示。只使用了每个字节的低7位,共个字符,对应标准美国键盘上的字母和符号。剩下的最高位被各种计算机用来创建私有字符集,比如IBMPC的扩展ASCII码。
■ANSI字符集
如图4-1所示。美国国家标准委员会(ANSI)定义了一个8位的字符集,用于表示个字符,前个对应标准美国键盘上的字母和符号。后个字符用于表示特殊字符,如其他语言字母表中的字母、重音符号、货币符号和分数等。MS-WindowsMe/95/98使用ANSI字符集。
提示
1.注意观察ASCII表,常用的ASCII字符对应的16进制数值需要熟记于心。如响铃字符的ASCII值07H,退格字符08H,TAB制表符09H,换行符0AH,回车符0DH,空格符20H,CTRL+B的ASCII值02H,CTRL+C的ASCII值03H。
2.大写字母“A~Z”的ASCII值为41H~5AH,小写字母“a~z”的ASCII值为61H~7AH,数字符“0~9”的ASCII值为30H~39H。
3.可见字符的ASCII值从20H开始,到7EH结束。
■Unicode标准
计算机软件中表示各种不同国家的语言有上百种编码方案,比较混乱。由此创建Unicode标准作为定义字符和符号的统一方法。Unicode标准定义了所有主要语言中使用的字母、符号及标点。Unicode有三种编码形式:
●UTF-8:ASCII码在UTF-8编码中占用一个字节,其字节值和ASCII码值相同。所有Unicode字符都可以用一种变长的编码系统表示。
●UTF-16:用于访问效率和存储空间并重的环境中。例如:WindowsNT//XP使用UTF-16编码,每个字符用16个二进制数据位编码。
●UTF-32:用于不太关心存储空间的环境。每个字符都使用32个二进制数据位编码,宽度固定。
图4-1字符ASCII表
4.2.2变形国标码有了ASCII码,计算机可以处理数字、字母等字符,但是并不能处理汉字符。
我们国家年5月对六千多个常用汉字制定了交换码的国家标准,即GB2-80《信息交换用汉字编码字符集—基本集》。该标准规定了汉字信息交换的基本汉字符和一般图形字符,共计个,其中汉字分成两个等级共计个。该标准同时也给定了它们的二进制编码,即国标码。后来的字符集GBK收录个汉字,最新的字符集GB收录个汉字。
国标码是16位编码,高8位表示汉字符的区号,低8位表示汉字符的位号。实际上,为了给汉字符编码,该标准把代码表分成94个区,每个区94个位。区号和位号都从21H开始。一级汉字安排在30H区至57区,二级汉字安排在58H至77区。
机内码是汉字在计算机内部使用的编码。汉字的机内码采用变形国标码,其变换方法为:变形国标码=国标码+H,即将两个字节的最高位由0改1,其余7位不变。
区位码转换为国标码的方式:国标码是由区位码稍作转换得到。先将十进制区码和位码转换为十六进制的区码和位码,再将这个代码加上H,就得到国标码。
举例
某汉字区号为34,位号为56。区位码:。
34=B=22H
56=B=38H
国标码:H+H=H
变形国标码:H+H=C2D8H
4.3节键盘扫描码本节内容:键盘扫描码。
■键盘扫描码:计算机的键盘上的按键分为字符键、功能键和控制键。每一个按键都对应一个键盘扫描码。当按下按键时的扫描码称为通码,松开按键时的扫描码称为断码。如果按下的是字符键,则将其对应的一个字节的扫描码和一个字节的ASCII码存入键盘缓冲区。我们将在第十六章输入与输出中断中详细讲解。
4.3.1键盘扫描码键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。
按下按键时,开关接通,该芯片就产生一个扫描码,并说明按下的键在键盘上的位置。扫描码被送入主板上相关接口芯片中的寄存器,端口地址为60h。
松开按键时也产生一个扫描码,扫描码说明松开的键在键盘上的位置。松开键时产生的扫描码也被送入60h端口中。
按下时产生的扫描码称为通码,松开时的扫描码称为断码。断码=通码+80h。
从60端口读出扫描码,并转化为相应的ASCII码或状态信息,并存储在内存指定的空间(键盘缓冲区或状态字节)中。从键盘缓冲区读取扫描码进入显存就可以在屏幕显示。或者直接写入文件。
■scancode集
扫描码集分为set1、set2和set3。这里只介绍一般日常应用中的键盘码集set2。
基本scancode:绝大多数为1byte。
扩展scancode:由e0、e1或e2引导。
特殊的PrintScreen/SysRq键:e02ae。
物殊的Pause/Break键:e11d45e19dc5。
■小键盘scancode表
小键盘中的homeUpPgUpLeftRightEndDownPgDnInsDel由NumLock按下后再按得来。因此,会产生一个NumLockmark码后,再产生上述的mark通码。释放NumLock产生一个break断码。如表4-1所示。
■附加键scancode表
如表4-2所示。
■功能键scancode表
如表4-3所示。
■主键盘scancode表
如表4-4所示。若输入字符“ABCD”有两种方法:
●按下CapsLock键后,再输入abcd键,再按CapsLock键,产生一个CapsLock键mark和break码,然后依次是abcd的mark和break码,最后是CapsLock的mark和break码。
●按着L-shift或R-shift不放,再按abcd键,再放开L-shift或R-shift键
产生一个L-shift或R-shift键的mark码,然后依次是abcd的mark和break码,最后是一个L-shift或R-shift键的break码。
表4-1小键盘扫描码
表4-2附加键扫描码
表4-3功能键扫描码
表4-4主键盘扫描码
本文摘自编程达人系列教材《X86汇编语言基础教程》。