目录
编译环境
notepad++ DosBox
环境配置已经有许多大佬写过,可以参考。
首先用notepad++建立一个"hello world"
.model tiny
.code
.startup
mov dx,offset string
mov ah,9
int 21h
.exit 0
string db 'HelloWorld!',0dh,0ah,'$'
end
然后用DosBox打开
接着输入 masm hello.asm
link hello.obj/tiny
debug hello.com
这样就可以成功打印hello world!
计算机中的数据表示
二进制、十进制、十六进制
不多赘述
ASCII码表
Bin (二进制) | Oct (八进制) | Dec (十进制) | Hex (十六进制) | 缩写/字符 | 解释 |
0000 0000 | 00 | 0 | 0x00 | NUL(null) | 空字符 |
0000 0001 | 01 | 1 | 0x01 | SOH(start of headline) | 标题开始 |
0000 0010 | 02 | 2 | 0x02 | STX (start of text) | 正文开始 |
0000 0011 | 03 | 3 | 0x03 | ETX (end of text) | 正文结束 |
0000 0100 | 04 | 4 | 0x04 | EOT (end of transmission) | 传输结束 |
0000 0101 | 05 | 5 | 0x05 | ENQ (enquiry) | 请求 |
0000 0110 | 06 | 6 | 0x06 | ACK (acknowledge) | 收到通知 |
0000 0111 | 07 | 7 | 0x07 | BEL (bell) | 响铃 |
0000 1000 | 010 | 8 | 0x08 | BS (backspace) | 退格 |
0000 1001 | 011 | 9 | 0x09 | HT (horizontal tab) | 水平制表符 |
0000 1010 | 012 | 10 | 0x0A | LF (NL line feed, new line) | 换行键 |
0000 1011 | 013 | 11 | 0x0B | VT (vertical tab) | 垂直制表符 |
0000 1100 | 014 | 12 | 0x0C | FF (NP form feed, new page) | 换页键 |
0000 1101 | 015 | 13 | 0x0D | CR (carriage return) | 回车键 |
0000 1110 | 016 | 14 | 0x0E | SO (shift out) | 不用切换 |
0000 1111 | 017 | 15 | 0x0F | SI (shift in) | 启用切换 |
0001 0000 | 020 | 16 | 0x10 | DLE (data link escape) | 数据链路转义 |
0001 0001 | 021 | 17 | 0x11 | DC1 (device control 1) | 设备控制1 |
0001 0010 | 022 | 18 | 0x12 | DC2 (device control 2) | 设备控制2 |
0001 0011 | 023 | 19 | 0x13 | DC3 (device control 3) | 设备控制3 |
0001 0100 | 024 | 20 | 0x14 | DC4 (device control 4) | 设备控制4 |
0001 0101 | 025 | 21 | 0x15 | NAK (negative acknowledge) | 拒绝接收 |
0001 0110 | 026 | 22 | 0x16 | SYN (synchronous idle) | 同步空闲 |
0001 0111 | 027 | 23 | 0x17 | ETB (end of trans. block) | 结束传输块 |
0001 1000 | 030 | 24 | 0x18 | CAN (cancel) | 取消 |
0001 1001 | 031 | 25 | 0x19 | EM (end of medium) | 媒介结束 |
0001 1010 | 032 | 26 | 0x1A | SUB (substitute) | 代替 |
0001 1011 | 033 | 27 | 0x1B | ESC (escape) | 换码(溢出) |
0001 1100 | 034 | 28 | 0x1C | FS (file separator) | 文件分隔符 |
0001 1101 | 035 | 29 | 0x1D | GS (group separator) | 分组符 |
0001 1110 | 036 | 30 | 0x1E | RS (record separator) | 记录分隔符 |
0001 1111 | 037 | 31 | 0x1F | US (unit separator) | 单元分隔符 |
0010 0000 | 040 | 32 | 0x20 | (space) | 空格 |
0010 0001 | 041 | 33 | 0x21 | ! | 叹号 |
0010 0010 | 042 | 34 | 0x22 | " | 双引号 |
0010 0011 | 043 | 35 | 0x23 | # | 井号 |
0010 0100 | 044 | 36 | 0x24 | $ | 美元符 |
0010 0101 | 045 | 37 | 0x25 | % | 百分号 |
0010 0110 | 046 | 38 | 0x26 | & | 和号 |
0010 0111 | 047 | 39 | 0x27 | ' | 闭单引号 |
0010 1000 | 050 | 40 | 0x28 | ( | 开括号 |
0010 1001 | 051 | 41 | 0x29 | ) | 闭括号 |
0010 1010 | 052 | 42 | 0x2A | * | 星号 |
0010 1011 | 053 | 43 | 0x2B | + | 加号 |
0010 1100 | 054 | 44 | 0x2C | , | 逗号 |
0010 1101 | 055 | 45 | 0x2D | - | 减号/破折号 |
0010 1110 | 056 | 46 | 0x2E | . | 句号 |
0010 1111 | 057 | 47 | 0x2F | / | 斜杠 |
0011 0000 | 060 | 48 | 0x30 | 0 | 字符0 |
0011 0001 | 061 | 49 | 0x31 | 1 | 字符1 |
0011 0010 | 062 | 50 | 0x32 | 2 | 字符2 |
0011 0011 | 063 | 51 | 0x33 | 3 | 字符3 |
0011 0100 | 064 | 52 | 0x34 | 4 | 字符4 |
0011 0101 | 065 | 53 | 0x35 | 5 | 字符5 |
0011 0110 | 066 | 54 | 0x36 | 6 | 字符6 |
0011 0111 | 067 | 55 | 0x37 | 7 | 字符7 |
0011 1000 | 070 | 56 | 0x38 | 8 | 字符8 |
0011 1001 | 071 | 57 | 0x39 | 9 | 字符9 |
0011 1010 | 072 | 58 | 0x3A | : | 冒号 |
0011 1011 | 073 | 59 | 0x3B | ; | 分号 |
0011 1100 | 074 | 60 | 0x3C | < | 小于 |
0011 1101 | 075 | 61 | 0x3D | = | 等号 |
0011 1110 | 076 | 62 | 0x3E | > | 大于 |
0011 1111 | 077 | 63 | 0x3F | ? | 问号 |
0100 0000 | 0100 | 64 | 0x40 | @ | 电子邮件符号 |
0100 0001 | 0101 | 65 | 0x41 | A | 大写字母A |
0100 0010 | 0102 | 66 | 0x42 | B | 大写字母B |
0100 0011 | 0103 | 67 | 0x43 | C | 大写字母C |
0100 0100 | 0104 | 68 | 0x44 | D | 大写字母D |
0100 0101 | 0105 | 69 | 0x45 | E | 大写字母E |
0100 0110 | 0106 | 70 | 0x46 | F | 大写字母F |
0100 0111 | 0107 | 71 | 0x47 | G | 大写字母G |
0100 1000 | 0110 | 72 | 0x48 | H | 大写字母H |
0100 1001 | 0111 | 73 | 0x49 | I | 大写字母I |
01001010 | 0112 | 74 | 0x4A | J | 大写字母J |
0100 1011 | 0113 | 75 | 0x4B | K | 大写字母K |
0100 1100 | 0114 | 76 | 0x4C | L | 大写字母L |
0100 1101 | 0115 | 77 | 0x4D | M | 大写字母M |
0100 1110 | 0116 | 78 | 0x4E | N | 大写字母N |
0100 1111 | 0117 | 79 | 0x4F | O | 大写字母O |
0101 0000 | 0120 | 80 | 0x50 | P | 大写字母P |
0101 0001 | 0121 | 81 | 0x51 | Q | 大写字母Q |
0101 0010 | 0122 | 82 | 0x52 | R | 大写字母R |
0101 0011 | 0123 | 83 | 0x53 | S | 大写字母S |
0101 0100 | 0124 | 84 | 0x54 | T | 大写字母T |
0101 0101 | 0125 | 85 | 0x55 | U | 大写字母U |
0101 0110 | 0126 | 86 | 0x56 | V | 大写字母V |
0101 0111 | 0127 | 87 | 0x57 | W | 大写字母W |
0101 1000 | 0130 | 88 | 0x58 | X | 大写字母X |
0101 1001 | 0131 | 89 | 0x59 | Y | 大写字母Y |
0101 1010 | 0132 | 90 | 0x5A | Z | 大写字母Z |
0101 1011 | 0133 | 91 | 0x5B | [ | 开方括号 |
0101 1100 | 0134 | 92 | 0x5C | \ | 反斜杠 |
0101 1101 | 0135 | 93 | 0x5D | ] | 闭方括号 |
0101 1110 | 0136 | 94 | 0x5E | ^ | 脱字符 |
0101 1111 | 0137 | 95 | 0x5F | _ | 下划线 |
0110 0000 | 0140 | 96 | 0x60 | ` | 开单引号 |
0110 0001 | 0141 | 97 | 0x61 | a | 小写字母a |
0110 0010 | 0142 | 98 | 0x62 | b | 小写字母b |
0110 0011 | 0143 | 99 | 0x63 | c | 小写字母c |
0110 0100 | 0144 | 100 | 0x64 | d | 小写字母d |
0110 0101 | 0145 | 101 | 0x65 | e | 小写字母e |
0110 0110 | 0146 | 102 | 0x66 | f | 小写字母f |
0110 0111 | 0147 | 103 | 0x67 | g | 小写字母g |
0110 1000 | 0150 | 104 | 0x68 | h | 小写字母h |
0110 1001 | 0151 | 105 | 0x69 | i | 小写字母i |
0110 1010 | 0152 | 106 | 0x6A | j | 小写字母j |
0110 1011 | 0153 | 107 | 0x6B | k | 小写字母k |
0110 1100 | 0154 | 108 | 0x6C | l | 小写字母l |
0110 1101 | 0155 | 109 | 0x6D | m | 小写字母m |
0110 1110 | 0156 | 110 | 0x6E | n | 小写字母n |
0110 1111 | 0157 | 111 | 0x6F | o | 小写字母o |
0111 0000 | 0160 | 112 | 0x70 | p | 小写字母p |
0111 0001 | 0161 | 113 | 0x71 | q | 小写字母q |
0111 0010 | 0162 | 114 | 0x72 | r | 小写字母r |
0111 0011 | 0163 | 115 | 0x73 | s | 小写字母s |
0111 0100 | 0164 | 116 | 0x74 | t | 小写字母t |
0111 0101 | 0165 | 117 | 0x75 | u | 小写字母u |
0111 0110 | 0166 | 118 | 0x76 | v | 小写字母v |
0111 0111 | 0167 | 119 | 0x77 | w | 小写字母w |
0111 1000 | 0170 | 120 | 0x78 | x | 小写字母x |
0111 1001 | 0171 | 121 | 0x79 | y | 小写字母y |
0111 1010 | 0172 | 122 | 0x7A | z | 小写字母z |
0111 1011 | 0173 | 123 | 0x7B | { | 开花括号 |
0111 1100 | 0174 | 124 | 0x7C | | | 垂线 |
0111 1101 | 0175 | 125 | 0x7D | } | 闭花括号 |
0111 1110 | 0176 | 126 | 0x7E | ~ | 波浪号 |
0111 1111 | 0177 | 127 | 0x7F | DEL (delete) | 删除 |
来自百度。
计算机中的数据表示
无符号数的表示
在数据处理的过程中,如不需要设置符号位时,可用全部字长来表示数值大小
有符号数的表示
把二进制数的最高位定义为符号位,符号位为 0 表示正数,符号位为 1 表示负数
补码定义: 若X>0, 则[X]补= [X]反= [X]原 若X<0, 则[X]补= [X]反+1
如:
X= –52= – 0110100 [X]原 = 10110100 [X]反 = 11001011 [X]补 = [X]反+1=11001100=0CCH
char 型为有符号8位整数,取值范围在-128~127之间。
unsigned char 型为无符号8 位整数,取值范围在0~255之间。
short 型为有符号16位整数,取值范围在-32,768~32,767之间。
unsigned short 型为无符号16位整数,取值范围在0~65,535之间。
int 型为有符号32位整数,取值范围在-2,147,483,648~2,147,483,647之间。
unsigned int 型为无符号32位整数,取值范围在0~4,294,967,295之间。
long型为64位有符号整数,取值范围在9,223,372,036,854,775,808~9,223,372,036,854,775,807之间。
unsigned long型为64位无符号整数,取值范围在0~18,446,744,073,709,551,615之间
8086微处理器
CPU
8086的16位通用寄存器是: AX BX CX DX SI DI BP SP
其中前4个数据寄存器都还可以分成高8位和低8位两个独立的寄存器: AH BH CH DH AL BL CL DL
寄存器
每个寄存器又有它们各自的专用目的
AX--累加器(Accumulate Register),使用频度最高,用于算术、逻辑运算以及与外设传送信息等;
BX--基址寄存器(Base Register),常用做存放存储器地址;
CX-- (Counter Register)计数器,作为循环和串操作等指令中的隐含计数器;
DX-- (Data Register)数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。
变址寄存器常用于存储器寻址时提供地址
SI是源变址寄存器 (Source index)
DI是目的变址寄存器 (Destination index)
串操作类指令中,SI和DI具有特别的功能
指针寄存器用于寻址内存堆栈内的数据
SP为堆栈指针寄存器(Stack Pointer),指示栈顶的偏移地址
SP不能再用于其他目的,具有专用目的
BP为基址指针寄存器(Base Pointer),表示数据在堆栈段中的基地址
SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址
堆栈是主存中一个特殊的区域
它采用先进后出FILO(First In Last Out)或后进先出LIFO(Last In First Out)的原则进行存取操作,而不是随机存取操作方式。
堆栈通常由处理器自动维持。在8086中,由堆栈段寄存器SS和堆栈指针寄存器SP共同指示
指令指针IP
指令指针寄存器IP,指示代码段中指令的偏移地址
它与代码段寄存器CS联用,确定下一条指令的物理地址
计算机通过CS : IP寄存器来控制指令序列的执行流程 IP寄存器是一个专用寄存器
标志寄存器
进位标志CF(Carry Flag)
对于无符号数运算,当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。 Debug表示: CY(Carry) CF = 1; NC(No Carry) CF = 0;
零标志ZF(Zero Flag)
若运算结果为0,则ZF = 1;否则ZF = 0 Debug表示: ZR(Zero) ZF = 1; NZ(No Zero) ZF = 0
符号标志SF(Sign Flag)
运算结果最高位为1,则SF = 1;否则SF = 0 Debug表示: NG(Negative) SF = 1; PL(Plus) SF = 0
溢出标志OF(Overflow Flag)
对于有符号数运算,若算术运算的结果有溢出,则OF=1;否则 OF=0 Debug表示: OV(Overflow) OF = 1; NV(No Overflow) OF = 0
奇偶标志PF(Parity Flag)
当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0 Debug表示: PE(Parity Even) PF = 1; PO(Parity Odd) PF = 0
辅助进位标志AF(Auxiliary Carry Flag)
运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。 Debug表示: AC(Auxiliary Carry) AF = 1; NA(No Auxiliary Carry) AF = 0
方向标志DF(Direction Flag)
用于串操作指令中,控制地址的变化方向: 设置DF=0,存储器地址自动增加; 设置DF=1,存储器地址自动减少。 Debug表示: DN (Down) DF = 1; UP(Up) DF = 0
中断允许标志IF(Interrupt-enable Flag)
用于控制外部可屏蔽中断是否可以被处理器响应: 设置IF=1,则允许中断; 设置IF=0,则禁止中断。 Debug表示: EI (Enable Interrupt) IF = 1; DI(Disable Interrupt) IF = 0
陷阱标志TF(Trap Flag)
用于控制处理器进入单步操作方式: 设置TF=0,处理器正常工作; 设置TF=1,处理器单步执行指令。
8086寻址
指令由操作码和操作数两部分组成
操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分
操作数是指令执行的参与者,即各种操作的对象
有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数
每种指令的操作码: 用一个唯一的助记符表示(指令功能的英文缩写) 对应着机器指令的一个二进制编码
指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址
立即数寻址方式
指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)
MOV AL,05H
寄存器寻址方式
操作数存放在CPU的内部寄存器reg中,可以是: 8位寄存器r8: AH、AL、BH、BL、CH、CL、DH、DL 16位寄存器r16: AX、BX、CX、DX、SI、DI、BP、SP 4个段寄存器seg: CS、DS、SS、ES
MOV BX,AX
存储器寻址方式
指令中给出操作数的主存地址信息(偏移地址,称之为有效地址EA),而段地址在默认的或用段超越前缀指定的段寄存器中
直接寻址方式
有效地址在指令中直接给出 默认的段地址在DS段寄存器,可使用段超越前缀改变
MOV AX,[2000H] ;
AX←DS:[2000H] ;指令代码:A10020
寄存器间接寻址方式
有效地址存放在基址寄存器BX或变址寄存器SI、DI中 默认的段地址在DS段寄存器,可使用段超越前缀改变
MOV AX,[SI]
寄存器相对寻址方式
有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI 有效地址=BX/BP/SI/DI+8/16位位移量 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变
MOV AX,[DI+06H]
基址变址寻址方式
有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 有效地址=BX/BP+SI/DI 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
MOV AX,[BX+SI] ;AX←DS:[BX+SI]
相对基址变址寻址方式
有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 有效地址=BX/BP+SI/DI+8/16位位移量
MOV AX,[BX+SI+06H] ;AX←DS:[BX+SI+06H]
数据传送指令
mov
传送指令MOV
把一个字节或字的操作数从源地址传送至目的地址
mov al,4 ;al←4,字节传送 mov cx,0ffh ;cx←00ffh,字传送 mov si,200h ;si←0200h,字传送 mov byte ptr [si],0ah ;byte ptr 说明是字节操作 mov word ptr [si+2],0bh ;word ptr 说明是字操作
XCHG
把两个地方的数据进行互换
寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能在存储器与存储器之间对换数据
mov ax,1234h ;ax=1234h
mov bx,5678h ;bx=5678h
xchg ax,bx ;ax=5678h,bx=1234h
xchg ah,al ;ax=7856h
XLAT
换码指令XLAT
将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL
PUSH
;进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部
POP
;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2
LEA
将存储器操作数的有效地址传送至指定的16位寄存器中
mov bx,0400h
mov si,3ch
lea bx,[bx+si+0f62h]
;BX=0400h+003ch+0f62h=139EH
ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
源操作数为立即数时,源操作数带扩展为和目的操作数相同长度类型
ADC
ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加法运算
INC
INC指令对操作数加1(增量) INC指令不影响进位CF标志,按定义设置其他状态标志
SUB
SUB指令将目的操作数减去源操作数,结果送到目的操作数 SUB指令按照定义相应设置状态标志
源操作数和目标操作数类型匹配 目标不能是立即数和CS段寄存器 两个操作数不能同时为存储器操作数 对于SUB mem, imm的形式,要指明mem的长度类型
SBB
SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。 SBB指令按照定义相应设置状态标志 SBB指令主要与SUB配合,实现多精度减法运算
DEC
DEC指令对操作数减1(减量) DEC指令不影响进位CF标志,按定义设置其他状态标志
NEG
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数 求补运算也可以表达成:将操作数按位取反后加1 NEG指令对标志的影响与用零作减法的SUB指令一样
CMP
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
CMP指令执行的功能与SUB指令相同,但结果不回送目的操作数
MUL
MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1
IMUL
IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1
DIV
DIV r8/m8 ;无符号字节除法:
AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数
DIV r16/m16 ;无符号字除法:
;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
IDIV
IDIV r8/m8 ;有符号字节除法:
AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数
IDIV r16/m16 ;有符号字除法:
;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
AND
对两个操作数执行逻辑与运算,结果送到目的操作数
AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义
OR
对两个操作数执行逻辑或运算,结果送到目的操作数
OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义
XOR
对两个操作数执行逻辑异或运算,结果送到目的操作数
XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义
NOT
对一个操作数执行逻辑非运算
NOT指令是一个单操作数指令 NOT指令不影响标志位
TEST
对两个操作数执行逻辑与运算,结果不回送到目的操作数
SHL
SHL reg/mem,1/CL (Shift Logical Left) ;逻辑左移,最高位进入CF,最低位补0
SHR
SHR reg/mem,1/CL (Shift Logical Right) ;逻辑右移,最低位进入CF,最高位补0
SAL
SAL reg/mem,1/CL (Shift Arithmetic Left) ;算术左移,最高位进入CF,最低位补0
SAR
SAR reg/mem,1/CL (Shift Arithmetic Right) ;算术右移,最低位进入CF,最高位不变
ROL
ROL reg/mem,1/CL ;(Rotate Left) 不带进位循环左移
ROR
ROR reg/mem,1/CL ; (Rotate Right) 不带进位循环右移
RCL
RCL reg/mem,1/CL ; (Rotate Carry Left) 带进位循环左移
RCR
RCR reg/mem,1/CL ; (Rotate Carry Right) 带进位循环右移
控制转移类指令
JMP
只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令
直接寻址方式
转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式
JMP label ;IP←IP+位移量
位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移
当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负
jmp again ;转移到again处继续执行
……
again: dec cx ;标号again的指令
……
jmp output ;转向output
……
output: mov result,al ;标号output的指令
间接寻址方式
转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式
JMP r16/m16 ;IP←r16/m16
将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容
jmp ax ;IP←AX
jmp word ptr [2000h] ;IP←[2000h]
Jcc
Jcc label ;条件满足,发生转移:IP←IP+8位位移量 ;条件不满足,顺序执行
⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)
⑵JS和JNS:利用符号标志SF,判断结果是正是负
⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出
⑷JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇
⑸JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位
无符号数的大小用高(Above)低(Below)表示
利用CF确定高低、利用ZF标志确定相等(Equal)
两数的高低分成4种关系:
⑴ 低于(不高于等于):JB(JNAE) CF=1
⑵ 不低于(高于等于):JNB(JAE) CF=0
⑶ 低于等于(不高于):JBE(JNA) CF=1或ZF=1
⑷ 不低于等于(高于):JNBE(JA )CF=0且 ZF=0
有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系:
⑴ 小于(不大于等于):JL(JNGE)(SF≠OF)
⑵ 不小于(大于等于):JNL(JGE)(SF=OF)
⑶ 小于等于(不大于):JLE(JNG) (SF≠OF或 ZF=1)
⑷ 不小于等于(大于):JNLE(JG )(SF=OF且ZF=0)
LOOP
LOOP label ;CX←CX-1, ;CX≠0,循环到标号label
LOOPZ label ;CX←CX-1, ;CX≠0且ZF=1,循环到标号label
LOOPNZ label ;CX←CX-1, ;CX≠0且ZF=0,循环到标号label
CALL
当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行
RET
当运行完子程序功能后,采用RET返回指令回到主程序继续执行
;主程序
mov al,0fh ;提供参数AL
call htoasc ;调用子程序
...
;子程序:将AL低4位的一位16进制数转换成ASCII码
Htoasc proc
and al,0fh ;只取al的低4位
or al,30h ;al高4位变成3
cmp al,39h ;是0~9,还是0Ah~0Fh
jbe htoend
add al,7 ;是0Ah~0Fh,加上7
htoend: ret ;子程序返回
Htoasc endp
INT
21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能
通常按照如下4个步骤进行:
⑴ 在AH寄存器中设置系统功能调用号
⑵ 在指定寄存器中设置入口参数
⑶ 执行指令INT 21H(或ROM-BIOS的中断向量号)实现中断服务程序的功能调用
⑷ 根据出口参数分析功能调用执行情况
DOS功能调用INT 21H
功能号:AH=02H
入口参数:DL=字符的ASCII码
功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出
DOS功能调用INT 21H
功能号:AH=09H
入口参数: DX=欲显示字符串在主存中的首地址 字符串应以$(24H)结束
功能:在显示器输出指定的字符串
可以输出回车(0DH)和换行(0AH)字符产生回车和换行的作用
DOS功能调用INT 21H
功能号:AH=01H
出口参数:AL=字符的ASCII码
功能:获得按键的ASCII代码值 调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值
DOS功能调用INT 21H
功能号:AH=0AH
入口参数:DS:DX=缓冲区首地址
执行该功能调用时,用户按键,最后用回车确认 本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按Ctrl+Break或Ctrl+C则中止
功能: 建立文件
调用号: 3CH
参数: DX=ASCIIZ串地址
CX=文件属性 0 :一般 1:只读 2:隐蔽 4:系统
返回: 成功:AX=文件代号 错误:AX=错误码
功能:打开文件
调用号: 3DH
参数: DX=ASCIIZ串地址
AL:为打开方式 =0 读 =1 写
返回: 成功:AX=文件代号
错误:AX=错误码
功能:关闭文件
调用号: 3EH
参数: BX=文件代号
返回: 错误:AX=错误码
功能:关闭文件
调用号: 3EH
参数: BX=文件代号
返回: 错误:AX=错误码
功能: 写文件
调用号: 40H
参数: BX=文件代号
DX=数据缓冲区地址
CX=写入的字节数
返回:读成功: AX=实际写入的字节数
读出错:AX=错误码
串操作指令
串传送指令:MOVSB / MOVSW
把字节或字操作数从主存的源地址传送至目的地址
MOVSB ;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1
MOVSW ;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2
串存储指令:STOSB / STOSW
把AL或AX数据传送至目的地址
STOSB ;字节串存储:ES:[DI]←AL ;DI←DI±1
STOSB ;字节串存储:ES:[DI]←AL ;DI←DI±1
串读取指令:LODSB / LODSW
把指定主存单元的数据传送给AL或AX
LODSB ;字节串读取:AL←DS:[SI] ;SI←SI±1
LODSW ;字串读取:AX←DS:[SI] ;SI←SI±2
串比较指令:CMPSB / CMPSW
将主存中的源操作数减去目的操作数,以便设置标志,进而比较两操作数之间的关系
CMPSB ;字节串比较:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1
CMPSW ;字串比较:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2
串扫描指令:SCASB / SCASW
将AL/AX减去目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系
SCASB ;字节串扫描:AL-ES:[DI] ;DI←DI±1
SCASW ;字串扫描:AX-ES:[DI] ;DI←DI±2
重复前缀指令:REP / REPZ / REPNZ
REP前缀可以理解为:当数据串没有结束(CX≠0),则继续传送
REPZ/REPE前缀可以理解为:当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较
REPNZ/REPNE前缀可以理解为:当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续比较
DB
DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值
初值表中每个数据一定是字节量(Byte),存放一个8位数据:
可以是0~255的无符号数
或是-128~+127带符号数
也可以是字符串常数
DW
DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值
初值表中每个数据一定是字量(Word),一个字单元可用于存放任何16位数据:
一个段地址
一个偏移地址
两个字符 0~65535之间的无符号数
-32768~+32767之间的带符号数
DD
DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值
初值表中每个数据是一个32位的双字量(Double Word):
可以是有符号或无符号的32位整数
也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针
OFFSET
PTR
PTR操作符使名字或标号具有指定的类型
mov byte ptr [2000H],10H 使用PTR操作符,可以临时改变名字或标号的类型