技术

ICS 与 8086 复习 02:进制转换 字符编码与字节序

ICS 与 8086 汇编复习 · 第 02 篇 系列目录 · 上一篇 · 下一篇

内存中出现 41 00 00 00,它究竟是整数 65、字符 A,还是某条指令的一部分?这类题的关键,是先确定宽度、编码和排列方式,再计算数值。只看到一串十六进制数就下结论,往往会把几个独立问题混在一起。

本篇集中复习进制转换、数据单位、字符编码、大小端和位操作。有符号整数与浮点数分别留到下一篇和第四篇展开。

进制转换应当保留位权

二进制各位的权是 2 的整数次幂。小数点左边从 2^0 向上递增,右边依次是 2^-1、2^-2……。例如:

178.125 = 128 + 32 + 16 + 2 + 1/8
        = 10110010.001B
        = B2.2H

二进制转十六进制时,以小数点为界向左右每四位分组;整数端在左补零,小数端在右补零,因此 10110010.001B 应分为 1011 0010 . 0010。小数部分若左补零,会改变位权和真值。

十进制整数可以反复除二取余,再逆序排列;小数则反复乘二,顺序取整数部分。例如 0.625×2=1.25、0.25×2=0.5、0.5×2=1,得到 .101B。约分后分母只含因子 2 的有理数,才能在有限位二进制中精确表示;所以 1/8 可以,1/10 不行。

位宽和容量需要看单位

在本系列讨论的 x86 环境中,一字节为 8 位。x86 的 word 固定为 16 位、doubleword 为 32 位,不能因为使用 32 位处理器就把 word 改成 32 位。数据类型大小、寄存器宽度、地址位数也不是同一个概念。

容量题先明确倍率。课件沿用了“KB 按 1024 算”的教学习惯;题目这样规定时应按其约定计算。严谨表示中,1 KiB=1024 B,1 kB=1000 B;b 表示 bit,B 表示 byte。二进制与十进制前缀的定义可核对 NIST 的二进制前缀说明。

例如,按十进制标注的 100 Mb/s,理想换算为 12.5 MB/s,不是 100 MB/s;实际文件传输还会受到协议等因素影响。若题目问 16 根地址线可覆盖多少字节,还必须有“按字节编址且地址线均参与编址”的前提,才能得到 2^16 B=64 KiB。

端序决定多字节对象的排列

假定一个 32 位整数的位模式为 12345678H,从地址 1000H 开始存放:

地址 小端存储 大端存储
1000H 78H 12H
1001H 56H 34H
1002H 34H 56H
1003H 12H 78H

小端是低有效字节放低地址,大端是高有效字节放低地址。两者的对象起始地址都是 1000H。端序改变字节排列,不改变该对象的抽象数值,也不要求颠倒每个字节内部的位。

读转储题时,先画地址递增方向,再按数据宽度取连续字节。x86 中从 1001H 读取一个 16 位字,得到的是 3456H。如果只读取一个字节,则没有多字节端序问题。

指令也应按编码规则逐字段读取。不能把整条机器指令所有字节一概倒序;其中的立即数、位移等多字节字段遵循各自的编码规定。

字符编码与数值编码要分开

ASCII 中,'0' 对应 30H,'9' 对应 39H,'A' 对应 41H。数值 5 的一个字节可以是 05H,字符 '5' 则是 35H。所以把小整数转换成十进制数字字符,常见做法是加 '0',但只适用于 0 到 9。

传统汉字编码题应注明体系。在课件采用的 GB2312 双字节区位表示中,若“区”和“位”是十进制编号,分别加十进制 32,得到相应国标交换码的两个字节;在常见 EUC-CN 机内表示中,再分别置最高位。

以区位 20、83 为例:

20 + 32 = 52  = 34H
83 + 32 = 115 = 73H
国标交换码两个字节:34H 73H
常见机内表示两个字节:B4H F3H

这里的 20 和 83 不能误当成十六进制。也不能把这一算法套到 UTF-8;汉字占几个字节取决于具体编码,“每个汉字固定两个字节”并非普遍规则。输入码解决怎样输入,字符编码解决怎样存储,字模或轮廓解决怎样显示,它们各自承担不同任务。

位运算如何提取信息

给定 y=2C0BH,提取高字节要先明确所需结果。如果要高字节仍留在原位,计算 y & FF00H 得 2C00H;如果要得到 0 到 255 的数值,应计算 (y >> 8) & FFH,结果为 2CH。

目的 常用形式
保留选中的位 x & mask
将选中的位置 1 x | mask
翻转选中的位 x ^ mask
将选中的位清零 x & ~mask

& 与 && 的区别也应通过操作对象理解。若 x=2、y=1,则 x&y=0,而 x&&y=1;前者逐位运算,后者判断两个值是否都非零,并具有短路求值规则。位操作题通常优先使用无符号类型,能更直接地表达位串意图。

自测与简答

  1. 0.375 的二进制是什么?能否有限表示?
  2. 小端内存从低地址起是 01 00 FF FF,按 32 位补码整数解释是多少?
  3. y=ABCDH 时,保留低字节、把高字节清零,结果是多少?

简答: ① .011B,可以。② 位模式为 FFFF0001H,有符号真值为 -65535。③ y & 00FFH = 00CDH。答第二题必须同时使用端序和补码规则;只有字节排列还不足以确定有符号真值。

来源定位

主要依据 2.数据的机器级表示与处理-V1.0.pptx 第9—20页的进制与表示三要素、第106—127页的字符、宽度、存储与端序、第129—135页的位操作。GB2312 区位例据第110—113页重述;现代字符编码的适用范围和容量前缀说明用于限定原结论。

系列导航

CONTINUE / PATH

从这里继续

顺着当前内容继续,或者换到另一个板块。

讨论这篇文章

关于《ICS 与 8086 复习 02:进制转换 字符编码与字节序》的补充、不同意见或延伸话题,都可以留在这里。

滚动到这里时自动载入留言。