汇编语言Irvine32链接库


汇编语言编程没有 Microsoft 认可的标准库。在 20 世纪 80 年代早期,程序员第一次开始为 x86 处理器编写汇编语言时,MS-DOS 是常用的操作系统。这些 16 位程序可以调用 MS-DOS 函数(即 INT 21h 服务)来实现简单的输入输出。

即使是在那个时代,如果想在控制台上显示一个整数,也需要编写一个相当复杂的程序,将整数的内部二进制表示转换为可以在屏幕上显示的 ASCII 字符序列。这个过程被称为 WriteInt,下面是其抽象为伪代码的逻辑:

初始化:

let n equal the binary value
let buffer be an array of char[size]

算法:
i = size -1                      ;缓冲区最后一个位置
repeat
  r = n mod 10                   ;余数
  n = n / 10                     ;整数除法
  digit = r OR 30h               ;将工转换为 ASCII 数字
  bufferf[i--] = digit           ;保存到缓冲区
until n = 0
if n is negative
  buffer[i] = "-"                ;插入负号
while i > 0
  print buffer[i]
  i++
注意,数字是按照逆序生成,插入缓冲区,从后往前移动。然后,数字按照正序写到控制台。虽然这段代码简单到足以用 C/C++ 实现,但是如果是在汇编语言中,它还需要一些高级技巧。

专业程序员通常更愿意自己建立库,这是一种很好的学习经验。在 Windows 的 32 位模式下,输入输出库必须能直接调用操作系统的内容。这个学习曲线相当陡峭,对编程初学者提出了一些挑战。因此,Irvine32 链接库被设计成给初学者提供简单的输入输岀接口。

随着学习的推进,我们将能获得自己创建库的知识和技术。只要成为库的创建者,就能自由地修改和重用库。

下表列出了 Irvine32 链接库的全部过程。

过程 说明
CloseFile 关闭之前已经打开的磁盘文件
Clrscr 清除控制台窗口,并将光标置于左上角
CreateOutputFile 为输出模式下的写操作创建一个新的磁盘文件
Crlf 在控制台窗口中写一个行结束的序列
Delay 程序执行暂停指定的 n 毫秒
DumpMem 以十六进制形式,在控制台窗口写一个内存块
DumpRegs 以十六进制形式显示 EAX、EEX、ECX、EDX、ESI、EDI、EBP、ESP、EFLAGS 和 EIP 寄存器。也显示最常见的 CPU 状态标志位
GetCommandTail 复制程序命名行参数(称为命令尾)到一个字节数组
GetDateTime 从系统获取当前日期和时间
GetMaxXY 返回控制台窗口缓冲器的行数和列数
GetMseconds 返回从午夜开始经过的毫秒数
GetTextColor 返回当前控制台窗口的前景色和背景色
Gotoxy 将光标定位到控制台窗口内指定的位置
IsDigit 如果 AL 寄存器中包含了十进制数字(0-9)的 ASCII 码,则零标志位置 1
MsgBox 显示一个弹出消息框
MsgBoxAsk 在弹出消息框中显示 yes/no 问题
OpenlnputFile 打开一个已有磁盘文件进行输入操作
ParseDecimal32 将一个无符号十进制整数字符串转换为 32 位二进制数
Parselnteger32 将一个有符号十进制整数字符串转换为 32 位二进制数
Random32 在 0〜FFFFFFFFh 范围内,生成一个 32 位的伪随机整数
Randomize 用一个值作为随机数生成器的种子
RandomRange 在特定范围内生成一个伪随机整数
ReadChar 等待从键盘输入一个字符,并返回该字符
ReadDec 从键盘读取一个无符号 32 位十进制整数,用回车符结束
ReadFromFile 将一个输入磁盘文件读入缓冲区
ReadHex 从键盘读取一个 32 位十六进制整数,用回车符结束
Readlnt 从键盘读取一个有符号 32 位十进制整数,用回车符结束
ReadKey 无需等待输入即从键盘输入缓冲区读取一个字符
ReadString 从键盘读取一个字符串,用回车符结束
SetTextColor 设置控制台输出字符的前景色和背景色
Str_compare 比较两个字符串
Str_copy 将源字符串复制到目的字符串
Str_length 用 EAX 返回字符串长度
Str_trim 从字符串删除不需要的字符
Str_ucase 将字符串转换为大写字母
WaitMsg 显示信息并等待按键操作
WriteBin 用 ASCII 二进制格式,向控制台窗口写一个无符号 32 位整数
WriteBinB 用字节、字或双字格式向控制台窗口写一个二进制整数
WriteChar 在控制台窗口写一个字符
WriteDec 用十进制格式,向控制台窗口写一个无符号 32 位整数
WriteHex 用十六进制格式,向控制台窗口写一个 32 位整数
WriteHexB 用十六进制格式,向控制台窗口写一个字节、字或双字整数
Writelnt 用十进制格式,向控制台窗口写一个有符号 32 位整数
WriteStackFrame 向控制台窗口写当前过程的堆栈帧
WriteStackFrameName 向控制台窗口写当前过程的名称和堆栈帧
WriteString 向控制台窗口写一个以空字符结束的字符串
WriteToFile 将缓冲区内容写入一个输出文件
WriteWindowsMsg 显示一个字符串,包含 MS-Windows 最近一次产生的错误