本文转载自厉害的 孔姐姐博客

由一只孔姐姐的小迷弟负责排版和整理~

一、汇编语言程序结构

.486                    ;处理器选择伪指令
 DATA SEGMENT USE16     ;段定义伪指令,定义数据段 
 ...
 DATA ENDS
 
 CODE SEGMENT USE16      ;段定义伪指令,定义代码段
   ASSUME CS:CODE,DS:DATA;段约定伪指令
BEGIN:
   MOV AX,DATA
   MOV DS,AX             ;DS初始化
 
   ...
   MOV AH,4CH            ;返回DOS
   INT 21H
CODE ENDS
END BEGIN                ;汇编结束伪指令
1.处理器选择伪指令

就. 486 .386 嗯嗯,至少要用. 386

2.段定义伪指令(SEGMENT ENDS为定界语句)

定位参数、链接参数、‘分类名’ 只在模块化程序中需要考虑。

对于我们学习的单一模块的程序,当需要定义堆栈段时,链接属性 STACK,分类名‘STACK’

段名:通常用 STACK 作为堆栈段的段名,DATA 作为数据段的段名,CODE 作为代码段的段名

3.段约定伪指令

ASSUME 指令,要求放在代码段之中

通知汇编程序,CODE 是代码段,对代码段寻址约定使用 DS 寄存器

对数据段寻址约定使用 DS 寄存器

4.汇编结束伪指令

END 程序启动指令标号

汇编程序对 END 之后额语句将不再进行任何处理。DOS 装载程序的可执行文件是,自动把标号所在段的段基址赋给 CS,把标号所在单元的偏移地址赋给 IP

5.DOS 的返回

程序完成预定任务之后,必须返回 DOS

MOV AH,4CH

INT 21H

二、汇编源程序的编程格式

(1)exe 文件

exe 文件允许使用多个逻辑段,每个逻辑段不超过 64KB,适合编写大型程序。(照应实模式的特点)

(2)com 文件

com 文件只允许使用一个逻辑段,即代码段。程序所使用的数据,可以集中设置在代码段的开始或末尾。需要使用 ORG 定位伪指令将程序的启动指令存放在代码段偏移地址为 100H 的单元。

ORG 指令用于通知汇编程序,将下一条指令或数据存放在表达式给出的段内其实偏移地址。

DATA SEGMENT AT 0040H
     ORG 0017H
KEYFLAG DB ?
DATA ENDS

定义了 KEYFLAG 变量,存放在段基址为 40H,偏移地址为 0017H 的内存单元中。

.586
CODE SEGMENT USE16
     ASSUME CS:CODE
     ORG 100H        ;启动指令BEG存放在代码段偏移地址为100H
BEG:
     JUMP START
     SUM DB ?        ;变量集中设置在代码段的开始或末尾
START:
     MOV AL,46H
     ADD AL,52H
     MOV SUM,AL
     MOV AH,4CH
     INT 21H
     
     CODE ENDS
     END  BEG

三、DOS 功能调用

1、调用模式:

MOV AH, 功能号

如果有入口参数,设置入口参数

INT 21H

如果有出口参数,分析出口情况

2、功能号

只能看着背呗。

先说入口、出口参数

入口 DL、DX 出口 AL(入口 DD 出口 A)

字符串都是 DX

然后开始自己编顺口溜:

1 读字符 2 显示;9 显字串输入 A;(09H 是显示字符串,0AH 键盘输入字符串,从 BUF+2 单元开始存放)

7、8 全都不回显,前否后是 ctrl_c;(前面的 7 不响应 ctrl_C,后面的 8 响应 0)

4CH 回 DOS,int 21 作终结。(返回 DOS 的操作系统)

emmm,还是很押韵的。编着编着,就记下来了。。。

这里对 0AH 功能号,要重点掌握。

四、BIOS 功能调用

  • 键盘 16 屏幕 10

  • 键盘 00 读字符

  • 键盘 01 查缓冲(Z=0 有输入)

  • 屏幕 00 设屏显

  • 0E、AL 字符显(如果是 DOS 的 21H,入口参数就是 DL)

  • 13 显示字符串

五、程序设计

1.子程序程序设计

子程序定界 PROC ENDP

CALL 指令调用 RET 返回

2.宏指令程序设计

宏指令定界 MACRO ENDM