微型计算机及接口技术笔记,微机原理与接口技术笔记(二)

本文详细介绍了汇编语言中的基本指令,包括转移类指令、数据传送指令、条件转移、循环控制、过程调用及中断控制。同时,讲解了伪指令的作用,如定义变量、段定义、内存偏移量设置等,并举例说明了其在程序中的应用。此外,还提到了系统功能调用,如DOS和BIOS的功能调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[TOC]

转移类指令

JMP Label 段内直接转移

MOV BX,1200H JMP BX执行完之后 IP=1200H了

MOV BX,1200

JMP WORD PTR[BX]段内间接转移,1200和1201这两个单元送给了IP

段间转移也是32位 JMP FAR Label

间接转移 JMP DWORD PTR[BX] DWORD指32位

428b3d6341ed986fdba50e60dd46e6a4.png

低地址送IP,高地址送CS

条件转移范围只有 -128到127

dc8e87cdf6a349e6b4e8ea883a99b1ce.png

81f676f3c4d5d70b75bf3e9b82e61f81.png

统计内存数据段中以TABLE为首地址的100个8位带符号数中的正数\负数和零的个数

START: XOR AL,AL

MOV PLUS,AL

MOV MINUS,AL

MOV ZERO,AL

LEA SI,TABLE

MOV CX,100

CHECK: LODSB

OR AL,AL

JS X1

JS X2

INC PLUS

JMP NEXT

X1: INC MINUS

JMP NEXT

X2: INC ZERO

NEXT: DEC CX

JNZ CHECK

HLT

循环控制指令

范围也非常小 是-128-127的

循环次数CX

无条件循环LOOP 只要CX不等于0

LOOPZ CX不等于0,ZF等于1继续循环

LOOPNZ CX不等于0,ZF等于0继续

在以DATA为首地址的内存数据段中,存放有200个16位有符号数,找出其中最大和最小的符号数,并分别放在MAX和MIN为首的内存单元中

START: LEA SI,DATA

MOV CX,200

CLD

LODSW

MOV MAX,AX

MOV MIN,AX

DEC CX

NEXT: LODSW

CMP AX,MAX

JG LARGE

CMP AX,MIN

JL SMALL

JMP GOON

LARGE: MOV MAX,AX

JMP GOON

SMALL: MOV MIN,AX

GOON: LOOP NEXT

HLT

过程调用指令

段内调用

CALL TIMER

CALL WORD PTR[SI]

SI后的两位送给IP

段间调用

CALL FAR TIMER

CALL DWORD PTR[SI]

RET 返回指令,子程序的最后一条指令必须是RET

中断控制指令

是一个远过程调用,需要记录FLAGS

INT n之后n*4就是存放中断服务子程序入口地址的单元偏移地址

2b69016ebd52bca3561910c6816b535b.png*

执行过程

FLAGS压栈

INT 指令的下一条指令的CS\IP压栈

n*4得到存放中断向量的地址

将中断向量送给CS IP

转入中断服务程序

处理器控制指令

标志位操作

CLC 清零标志位

STC 置1标志位

CMC 取反C

CLD

STD

CLI 关中断

STI IF置1 开中断

汇编语言源程序

过程

输入汇编语言源程序 .ASM

汇编 .OBJ

链接 .EXE

调试 最终环境

语句类型

指令性语句 CPU执行的语句

指示性语句 不执行 告诉汇编程序定义了多大内存等作用

格式

[标号:][前缀]助记符[操作数],[操作数][;注释]

伪指令助记符 操作数[,操作数,...][;注释]

常量

数字常量

字符串常量 'ABCD' 汇编时被译成对应的ASC码

变量 内存单元的符号地址

段值 变量所在的段地址

偏移量 变量所指单元的偏移地址

类型

表达式

算术 逻辑 关系运算

取值运算符

OFFSET 获得变量或者标号的偏移地址

SEG 获得变量或者标号的段地址

MOV AX,SEG 去变量的段地址送给DS

MOV DS,AX

MOV BX,OFFSET DATA 取变量的偏移地址送给BX

属性运算符

MOV BYTR PTR[BX],12H 字节12H

MOV WORD PTR[BX],12H 字0012H

伪指令

作用

定义变量

分配存储器

定义逻辑段

指示程序开始和结束

定义过程

数据定义伪指令

691aa7c7cc5268a3fcbcc49f02588421.png

指令助记符

大小

DB

1字节

DW

1字

DD

2字

DQ

4字

DT

10字

$$ \begin{array}{l}{\text { DATAI DB } 11 \mathrm{H} \text { , 22 H, 33H, 44H }} \ {\text { DATA2 DW } 11 \mathrm{H}, 22 \mathrm{H}, 3344 \mathrm{H}} \ {\text { DATA3 DD } 11 \mathrm{H}^{*} 2,22 \mathrm{H}, 33445566 \mathrm{H}}\end{array} $$

第二行的11H就相当于0011H 第三行的22H就是00000011H

b755f4aa43158b544eb76e549a90e7e1.png

注意高位对应高地址

DATA1 DB 'ABCD',66H 注意'ABCD'是四个变量

3b8888c6da89d054a972fc397a16d681.png

重复操作符

为一个区域各单元设置相同的初值 M1 DB 10 DUP(0) 定以一个以M1为首地址的10个字节单元,并且每个字节单元的初值都是0

MEM1 DB 34H,'A',?(问号表示一个随机数,占1个字节单元) DW 20 DUP(?) 40个单元的随机值

$$ \begin{array}{l}{\text { M1 DB 'How are you?" }} \ {\begin{array}{ll}{\text { M2 DW 3 DUP(11H), 3344H }} \ {\text { DB } 4 \text { DUP ( 2 ) }} \ {\text { ( M3 DB 3 DUP (22H, 11H, ?) }}\end{array}}\end{array} $$

19a5745af4556ecfc52a247d137f369e.png

符号定义伪指令

EQU 用一个符号代替表达式

符号名 EQU 表达式

EQU不会占用内存空间

段定义伪指令

说明逻辑段的起始和结束

说明不同程序模块中同类逻辑段之间的练习形态

SEGMENT [定位类型][组合类型][类别]

ENDS

e1cd5137efd21781a990f2f521d557aa.png

DATA SEGMENT

MEM1 DB 11H,22H

MEM2 DB 'HELLO'

MEM3 DW 2 DUP (?)

DATA ENDS

段名也表示逻辑段的段地址

变量在逻辑段中的位置就代表了它的偏移地址

设定段寄存器伪指令

ASSUME 段寄存器名:段名

结束伪指令

END [标号]

510a851e927c5656f1613df9e65b7470.png

只有代码段不需要初始化

206cc4390203de119bc9e85f19059343.png

过程定义伪指令

过程名 PROC [NEAR/FAR] (段内/段外)

​ RET 负责返回断点

过程名 ENDP

过程名是过程体的入口地址

DELAY PROC

PUSH BX

PUSH CX

MOV BL,2

NEXT:MOV CX,4167

W10M:LOOP W10M

DEC BL

JNZ NEXT//一共循环了2*4167次

POP CX

POP BX

RET

DELLAY ENDP

CALL DELAY 调用延时子程序

宏定义伪指令

与过程不同,不能成为一段可以独立执行的代码,只能和源程序一起用

宏命令名 MACRO

ENDM

DADD MACRO X,Y,Z

MOV AX,X

MOV AX,Y

MOV Z,AX

ENDM

DADD DATA1,DATA2,SUM 来进行调用

形参和实参的位置必须一一对应

调整偏移量伪指令

ORG 表达式(要求计算结果为非负常数)

DATA SEGMENT

ORG 1200H

BUFF DB 1,2

DATA ENDS

这样,BUFF的偏移地址就变成了1200H

系统功能调用

BIOS 驻留在ROM的基本输入输出系统

DOS(磁盘操作系统)功能调用的基本步骤

将调用参数装入指定的寄存器

将功能号装入AH

按中断类型号调用DOS中断

检查返回参数是否正确

MOV AH,功能号

INT 21H

单字符输入

MOV AH,01

INT 21H

可以敲一下键,键在AL中

GET KEY:MOV AH,1

INT 21H

CMP AL,'Y'

JZ YES

CMP AL,'N'

JZ NO

JMP GET KEY

字符串输入

64463b687a63d59bbefd6a87714de915.png

AH

DS:DX

DAT1 DB,20,?,20,DUP(?)//在数据段中定义

LEA DX,DAT1

MOV AH,0AH

INT 21H

单字符输出

MOV AH,2

MOV DL,41H

INT 21H

字符串输出

AH=09H

被显示的字符串必须以'$'为结束

45c8fd3438fe428f0c5fc8181fd2d125.png

返回操作系统功能

功能号 4CH

常用于程序结尾处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值