【8086汇编基础】05--常⽤函数库⽂件--emu8086.inc 8086汇编语⾔初学者教程(第5部分)
常⽤函数库 - emu8086.inc
通过引⽤⼀些常⽤函数,可以使你编程更加⽅便。
在你的程序中使⽤其他⽂件中的函数的⽅法是
INCLUDE后⾯接上你要引⽤的⽂件名。编译器
会⾃动在你源程序所在的⽂件夹中查你引⽤
的⽂件,如果没有到,它将搜索Inc ⽂件夹。
通常你⽆法完全理解 emu8086.inc(位于I nc⽂件夹)
但是这没有关系,你只⽤知道它能做什么就⾜够了。
要使⽤emu8086.inc中的函数,你应当在你程序的开
头加上
include 'emu8086.inc'
emu8086.inc 定义了如下的宏:
PUTC char - 将⼀个ascii字符输出到光标当前位值,只有⼀个
参数的宏
GOTOXY col, row -设置当前光标位置,有两个参数
PRINT string - 输出字符串,⼀个参数
PRINTN string - 输出字符串,⼀个参数。与print功能相同,
不同在于输出之后⾃动回车
CURSOROFF - 关闭⽂本光标
CURSORON - 打开⽂本光标
使⽤上述宏的⽅法是:在你需要的位值写上宏名称加上参数。例如:
include emu8086.inc
ORG 100h
PRINT 'Hello World!'
PRINT 'Hello World!'
GOTOXY 10, 5
PUTC 65 ; 65 - ASCII 码的 'A'
PUTC 'B'
RET ; 返回操作系统
END ; 停⽌编译器汇编语言要什么基础
当编译器运⾏你的代码时,它⾸先到声明中的
emu8086.inc⽂件,然后将代码中的宏⽤实际的
代码替换掉。通常来说,宏都是⽐较⼩的代码段,
经常使⽤宏会使得你的可执⾏程序特别⼤
(对于降低⽂件⼤⼩来说使⽤过程更好)
emu8086.inc同样定义了如下过程:
PRINT_STRING - 在当前光标位置输出⼀个字符串字符串地址由DS:SI 寄存器给出使⽤时,需要在END前⾯声明
DEFINE_PRINT_STRING 才能使⽤.
PTHIS - 在当前光标位置输出⼀个字符串(同 PRINT_STRING)
⼀样,不同之处在于它是从堆栈接收字符串。字符串终⽌符
应在call之后定义。例如
CALL PTHIS
db 'Hello World!', 0
使⽤时,需要在 END 前⾯声明 DEFINE_PTHIS 。
GET_STRING - 从⽤户输⼊得到⼀个字符串,输⼊的字符串写⼊ DS:DI 指出的缓冲,缓冲区的⼤⼩由 DX设置。回车作为输⼊结束。
使⽤时,需要在END前⾯声明DEFINE_GET_STRING 。
CLEAR_SCREEN - 清屏过程(滚过整个屏幕),然后将光标设置在左上⾓. 使⽤时,需要在END前⾯声明DEFINE_CLEAR_SCREEN 。
SCAN_NUM - 取得⽤户从键盘输⼊的多位有符号数,并将输⼊存放
在CX寄存器。 使⽤时,需要在 END前⾯声明 DEFINE_SCAN_NUM。
PRINT_NUM - 输出AX寄存器中的有符号数
使⽤时,需要在END 前⾯声明 DEFINE_PRINT_NUM以及 DEFINE_PRINT_NUM_UNS.
PRINT_NUM_UNS - 输出AX寄存器中的⽆符号数。使⽤时,需要在END 前⾯声明DEFINE_PRINT_NUM_UNS.
使⽤上述过程,必须在你源程序的底部(但是在END之前)声明这些函数,使⽤CALL指令后⾯接上过程名称来调⽤。例如:
include 'emu8086.inc'
ORG 100h
LEA SI, msg1 ; 要求输⼊数字
CALL print_string ;
CALL scan_num ; 读取数字放⼊cx
MOV AX, CX ; CX存放数值拷贝到AX
; 输⼊如下字符
CALL pthis
DB 13, 10, 'You have entered: ', 0
CALL print_num ; 输出 AX中的字符
RET ; 返回操作系统
msg1 DB 'Enter the number: ', 0
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS ; print_num函数要求的
DEFINE_PTHIS
END ; 结束
⾸先,编译器运⾏声明(对于宏只是展开)。当编译器遇到CALL指令,它
将⽤过程声明中的地址来替代过程名。程序在执⾏过程中遇到这个过程,便
会直接跳转到过程。这是⾮常有⽤的,⽐如,即使在你的代码中执⾏100次
⼀个过程,编译后的可执⾏⽂件也不会因此⽽增⼤多少。这样看起来很
划算,是不是?后⾯你会学到更多的,现在只需要了解⼀点点基本原理。
emu8086.inc⽂件内容如下:
emu8086.inc
1; emu8086.inc - macro definitions library for easy input/output
2
3
4
5
6; Note, that some declarations of "emu8086.inc" are macro procedure declarations, and you
7; have to use "DEFINE_..." macro somewhere in your program if you want to use these functions:
8
9; CALL SCAN_NUM
10; CALL PRINT_STRING
11; CALL PTHIS
12; CALL GET_STRING
13; CALL CLEAR_SCREEN
14; CALL PRINT_NUM
15; CALL PRINT_NUM_UNS
16
17; You can define all these procedures in your source code, but compilation time may slow down 18; sufficiently because of that, only declare functions that you plan to use:
19
20
21; DEFINE_SCAN_NUM
22; DEFINE_PRINT_STRING
23; DEFINE_PTHIS
24; DEFINE_GET_STRING
25; DEFINE_CLEAR_SCREEN
26; DEFINE_PRINT_NUM
27; DEFINE_PRINT_NUM_UNS
28
29; The above declarations should be made in your code once only! Better somewhere
30; in the end of your file, but before "END" directive. You can also declare them
31; in the beginning of the file, but it should be after "ORG 100h" directive for COM files,
32; or inside the code segment for EXE files.
33
34
35
36
37
38
39
40
41
42; this macro prints a char in AL and advances
43; the current cursor position:
44 PUTC MACRO char
45PUSH AX
46MOV AL, char
47MOV AH, 0Eh
48INT 10h
49POP AX
50 ENDM
51
52
53; this macro prints a string that is given as a parameter, example:
54; PRINT 'hello world!'
55; new line is NOT added.
56 PRINT MACRO sdat
57 LOCAL next_char, s_dcl, printed, skip_dcl
58
59PUSH AX ;
60PUSH SI ;
61
62JMP skip_dcl ; skip declaration.
63 s_dcl DB sdat, 0
64
65skip_dcl:
66LEA SI, s_dcl
67
68next_char:
69MOV AL, CS:[SI]
70CMP AL, 0
71JZ printed
72INC SI
73MOV AH, 0Eh ; teletype function.
74INT 10h
75JMP next_char
76printed:
77
78POP SI ;
79POP AX ;
80 ENDM
81
82
83; this macro prints a string that is given as a parameter, example: 84; PRINTN 'hello world!'
85; the same as PRINT, but new line is automatically added.
86 PRINTN MACRO sdat
87 LOCAL next_char, s_dcl, printed, skip_dcl
88
89PUSH AX ;
90PUSH SI ;
91
92JMP skip_dcl ; skip declaration.
93 s_dcl DB sdat, 13, 10, 0
94
95skip_dcl:
96LEA SI, s_dcl
97
98next_char:
99MOV AL, CS:[SI]
100CMP AL, 0
101JZ printed
102INC SI
103MOV AH, 0Eh ; teletype function.
104INT 10h
105JMP next_char
106printed:
107
108POP SI ;
109POP AX ;
110 ENDM
111
112
113; turns off the cursor:
114 CURSOROFF MACRO
115PUSH AX
116PUSH CX
117MOV AH, 1
118MOV CH, 28h
119MOV CL, 09h
120INT 10h
121POP CX
122POP AX
123 ENDM
124
125
126
127; turns on the cursor:
128 CURSORON MACRO
129PUSH AX
130PUSH CX
131MOV AH, 1
132MOV CH, 08h
133MOV CL, 09h
134INT 10h
135POP CX
136POP AX
137 ENDM
138
139; sets current cursor
140; position:
141 GOTOXY MACRO col, row
142PUSH AX
143PUSH BX
144PUSH DX
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论