实验环境:EMU8086
程序1
assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,bx
mov ax,4c00H
int 21H
codesg ends
end
程序说明:
在汇编语言程序中,包含两种指令:汇编指令、伪指令
汇编指令是有对应的机器码的指令,可以被翻译为机器指令,最终为CPU所执行。
而伪指令没有对应的机器指令,最终不被CPU所执行。伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
上述程序中包含以下伪指令:
㈠ 第一条伪指令
XXX segment
.
.
.
XXX ends
说明: segment 和 ends 是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。
功能: 定义一个段,segment说明一个段开始,ends说明一个段结束。
格式: 一个段必须有一个名称来标识,使用格式为:
段名 segment
.
.
段名 ends
如上述程序中的:
codesg segment ; 定义一个段,段的名称为“codesg",这个段从此开始
.
.
codesg ends ; 名称为"codesg"的段到此结束
段的用途: 段被用来存放代码、数据或当作栈空间来使用。
㈡ 第二条伪指令:end
功能: 一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束程序的编译。
用途: 程序写完了,要在结尾处加上伪指令end。
㈢ 第三条伪指令:assume
功能: 假设某一段寄存器和程序中的某一用segment…ends定义的段相关联。
用途: 在程序的开头,用assume将有特定用途的段和相关的段寄存器关联起来。
如上述程序中的:
assume cs:codesg
该语句将用作代码段的段codesg和CPU中的段寄存器cs联系起来。
汇编语言中,除了汇编指令和伪指令外,还有一些标号,比如"codesg"。一个标号指定了一个地址。比如codesg在segment的前面,作为一个段的名称,这个段的名称最终被编译、连接程序一个段的段地址。
DATA SEGMENT
MESSAGE DB 'THIS IS A SAMPLE PROGRAM OF KEYBOARD AND DISPLAY'
DB 0DH,0AH,'PLEASE STRIKE THE KEY!',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT PARA STACK'STACK'
DB 50 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV DX,OFFSET MESSAGE
MOV AH,9
INT 21H
AGAIN: MOV AH,1
INT 21H
CMP AL,1BH
JE EXIT
CMP AL,61H
JC ND
CMP AL,7AH
JA ND
AND AL,11011111B
ND: MOV DL,AL
MOV AH,2
INT 21H
JMP AGAIN
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
指令 | 功能 | |
汇编指令 | OFFSET | 取得其后变量或标号的偏移地址 |
MOV | 通用数据传送指令,传送字或字节 | |
INT 21H | 当AH=09H时,显示字符串。 调用参数:DS:DX=串地址 '$'结束字符串 |
|
当AH=01H时,键盘输入并回显。 返回参数AL=输入字符 |
||
当AH=02H时,显示输出。 调用参数DL="输出字符" |
||
当AH=4CH时,带返回码结束。 调用参数AL=返回码 |
||
CMP | 比较(结果只是影响6个状态标志位) | |
JE | 等于则跳转 | |
JC | 有进位则跳转 | |
JA | 高于则跳转 | |
JMP | 无条件跳转 | |
AND | 按位与 | |
伪指令 | SEGMENT...ENDS | 定义一个段,segment说明一个段开始, ends说明一个段结束 |
DB | 定义字节型数据 | |
PARA | 段对齐方式为节起始,起始地址以0H 结尾,能被16整除 |
|
DUP | 用来进行数据重复 | |
ASSUME | 假设某一段寄存器和程序中的某一用 segment...ends定义的段相关联 |
|
END | 结束程序的编译 |
此段程序中的标号有:
ASCII码对照表
其中,出现的ASCII码有