ディレクトリ
前注:https://www.cnblogs.com/Tony100K/p/11653755.html
転送タイプ命令
- JMPラベルセグメントにおける直接転送
- MOV BX、1200H JMP BX IP = 1200Hの実装が完了した後
- MOV BX、1200
- JMP WORD PTR間接転写【BX】内側部分、二つのユニット1200および1201はIPを与え
- 伝達セグメント32は、JMP FARラベルの間であります
- 間接転写JMP DWORD PTR [BX] DWORD手段32
- 高-CSを送信するためにIP、アドレスを送信するために低アドレス
-128〜127の条件付き転送範囲のみ
8ビットテーブル正\負の数、及びゼロシンボルは、データ・メモリ・セグメント統計100のアドレスにつながっ
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サイクル
無条件ループサイクルは、CX限り0に等しくありません
LOOPZ CXはZFサイクルを継続するために1に等しく、0に等しくありません
LOOPNZ CXが0に等しくない場合、ZFは続行0に等しいです
DATAは、MINとMAX率いるメモリユニットに、それぞれ最大値及びシンボルの最小数を識別し200 16ビット符号付き数を、記憶し、アドレス・メモリ・セグメントにつながっ
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]
- IPには、2つのSI後
- セグメント間の内部コール
- CALL FAR TIMER
- CALL DWORD PTR [SI]
- RETリターン命令は、サブルーチンの最後の命令は、RETでなければなりません
割り込み制御命令
- 遠くプロシージャ・コールは、あなたがFLAGSを記録する必要があります
- INT N N * 4である割り込みサービスルーチンエントリアドレス記憶部オフセットアドレス後
- *
実装プロセス
- 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
伪指令
作用
- 定义变量
- 分配存储器
- 定义逻辑段
- 指示程序开始和结束
- 定义过程
数据定义伪指令
指令助记符 | 大小 |
---|---|
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
注意高位对应高地址
DATA1 DB 'ABCD',66H 注意'ABCD'是四个变量
重复操作符
为一个区域各单元设置相同的初值
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} \]
符号定义伪指令
- EQU 用一个符号代替表达式
- 符号名 EQU 表达式
- EQU不会占用内存空间
段定义伪指令
- 说明逻辑段的起始和结束
说明不同程序模块中同类逻辑段之间的练习形态
SEGMENT [定位类型][组合类型][类别]
ENDS
DATA SEGMENT MEM1 DB 11H,22H MEM2 DB 'HELLO' MEM3 DW 2 DUP (?) DATA ENDS
段名也表示逻辑段的段地址
变量在逻辑段中的位置就代表了它的偏移地址
设定段寄存器伪指令
- ASSUME 段寄存器名:段名
结束伪指令
- END [标号]
- 只有代码段不需要初始化
过程定义伪指令
过程名 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
字符串输入
- AH<-- 功能号10
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
- 被显示的字符串必须以'$'为结束
返回操作系统功能
- 功能号 4CH
- 常用于程序结尾处