汇编语言编程没有 Microsoft 认可的标准库。在 20 世纪 80 年代早期,程序员第一次开始为 x86 处理器编写汇编语言时,MS-DOS 是常用的操作系统。这些 16 位程序可以调用 MS-DOS 函数(即 INT 21h 服务)来实现简单的输入输出。
即使是在那个时代,如果想在控制台上显示一个整数,也需要编写一个相当复杂的程序,将整数的内部二进制表示转换为可以在屏幕上显示的 ASCII 字符序列。这个过程被称为 WriteInt,下面是其抽象为伪代码的逻辑:
初始化:
算法:
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 最近一次产生的错误 |