跳转至

2 章 数据⚓︎

871 个字 预计阅读时间 4 分钟

数制⚓︎

关于二进制、八进制、十进制和十六进制的表示与转换就不再赘述了,这里就讲一下与汇编语言相关的内容。

汇编语言下各种进制的表示:

  • 二进制:用 B b 作为后缀
  • 八进制:用 Q q 作为后缀
  • 十进制:无需后缀
  • 十六进制:用 H h 作为后缀,若最高位是字母还需加前缀 0

注意

  • 前后缀不会存储在寄存器内
  • 为了表示方便,对于较长的数字,本笔记采用“每四位空一格”的方法表示数字,但在汇编语言中数字之间不得有空格

数据组织⚓︎

  • (bit):存储计算机数据的最小单位
  • 字节 (byte)
    • 存储计算机数据的基本单位
    • 可以表示 \([0, 255]\)\([00h, 0FFh]\))范围内的无符号数,或者 \([-128, 127]\)\([80h, 7Fh]\))范围内的符号数,或者 ASCII
    • 汇编语言中用关键词db定义字节类型的变量或数组
    • 相当于 C 语言中的charunsigned char
  • (word)
    • 1 = 2 字节 = 16
    • 8 位称为低字节,高 8 位称为高字节
    • 可以表示
      • \([0, 65535]\)\([0000h, 0FFFFh]\))范围内的无符号数
      • \([-32768, 32767]\)\([8000h, 7FFFh]\))范围内的符号数
      • 16 位的段地址或 16 位的偏移地址
    • 关键词:dw
    • 相当于 C 语言中的short intunsigned short int
  • 双字 (double word,简称 dword)
    • 1 双字 = 2 = 4 字节 = 32
    • 0-15 位称为低字,16-31 位称为高字,0-7 位称为低字节,24-31 位称为高字节
    • 可以表示
      • \([0, 4294967295]\)\([0000h, 0FFFFFFFFh]\))范围内的无符号数
      • \([-2147483648, 2147483647]\)\([80000000h, 7FFFFFFFh]\))范围内的符号数
      • float类型的小数
    • 关键词:dd
    • 相当于 C 语言中的long intunsigned long int
  • 四字 (quadruple word,简称 qword)

    • 1 四字 = 4 = 8 字节 = 64
    • 可以表示
      • \([0, 0FFFFFFFFFFFFFFFFh]\)\([0, 2^{64}-1]\))范围内的无符号数
      • \([8000000000000000h, 7FFFFFFFFFFFFFFFh]\)\([-2^{63}, 2^{63}-1]\))范围内的符号数
      • double类型的小数
    • 关键词:dq
    • 相当于 C 语言中的long longdouble

      注:旧版 VC 中不支持long long,可以用__int64替代

  • 十字节 (ten byte,简称 tbyte)

    • 字面意思,宽度为 10 字节,即 80
    • 可存放 80 位小数
    • 关键词:dt

零扩充与符号扩充⚓︎

汇编语言中绝大多数双操作数指令都要求两个操作数等宽,否则编译时会报错

test.ASM(9): error A2031: Operand types must match
  • 无符号数的扩充称为零扩充:往左侧补 0
  • 符号数的扩充称为符号扩充:正数左侧补 0,负数左侧补 1

运算⚓︎

算术运算⚓︎

指令 含义 用法
add 加法 add ax, bx
sub 减法 sub ax, bx
mul 无符号数乘法 mul bx
imul 符号数乘法 imul bx
div 无符号数除法 div bx
idiv 符号数除法 idiv bx
fadd 浮点数加法 fadd st(0), st(1)
fsub 浮点数减法 fsub st(0), st(1)
fmul 浮点数乘法 fmul st(0), st(1)
fdiv 浮点数除法 fdiv st(0), st(1)

逻辑运算和移位运算⚓︎

指令 含义 用法 C 语言等价运算符
and and ax, bx &
or or ax, bx \|
xor 异或 xor ax, bx ^
not not ax ~
shl 逻辑左移 shl ax, 1 <<
shr 逻辑右移 shr ax, 1 >>
sal 算术左移 sal ax, 1 <<
sar 算术右移 sar ax, 1 >>
rol 循环左移 rol ax, 1
ror 循环右移 ror ax, 1
rcl 带进位循环左移 rcl ax, 1
rcr 带进位循环右移 rcr ax, 1

评论区

如果大家有什么问题或想法,欢迎在下方留言~