汇编语言(基础笔记)
基础信息:
- reg -->寄存器
- sreg -->段寄存器
- CPU 16位线,寄存器也是16位。 地址总线20位。
物理地址 = 段地址X16+偏移地址
(2的20次方 = 1MB (即内存最多1MB 可知32位最多4GB,64位最多4ZB) 1个存储单元 = 8bit(8位)= 1字节(B /Byte) )
**存储单位一般用B,KB,MB,GB,TB,EB,ZB,YB,BB来表示**
- 寄存器
段寄存器:
CS IP 代码段
DS SI 数据段
SS SP 堆栈 BP
ES DI 附加寄存器
(数据不能直接送入段地址 要从数据寄存器中转移)
标志寄存器
FR
数据寄存器(16位)
AX(accumulator):累加器,它是算术运算的主要寄存器,此外还可以作为乘,除运算及输入,输出的专用寄存器。
BX(Base):基址寄存器,常用于存放存储区的起始地址。
CX(Count):计数寄存器,常用于循环操作或字符操作中的计数器。
DX(Data):该寄存器常与AX配合,用于双字长运算,DX存放高位字,AX存放底字位,此外还可以用于输入、输出指令中存放外部设备接口的端口地址
注意:[CX] [AX] [DX] [DS]是错误写法 [BX]是正确写法
[BX+si/di] / [BP+SI/DI] 是正确写法 其它是错误写法
大小写(字母是一个字节大小)
将第五位置0--->大写(and 11101111) 置1--->小写(or 00010000)
0000:0000 – 0000:03FF 1024个储存单元为中断程序(256个)的入口地址 (每个中断程序入口地址占2个字 = 4个字节/存储单元) 低地址放IP 高地址放CS
指令
- 跳转
Jmp CS:IP ;(段地址:偏移地址)
Jmp AX ;(段地址=DS 偏移地址=AX)
Jmp dword ptr ds:[0] ;(从DS:[0]中取[0+2]作为CS段地址,[0]作为IP地址)
Jmp word ptr ds:[0] ;(从DS[0] 中取[0]作为IP地址)
Jmp short ;(IP+8位的偏移地址)
Jmp near ;(Ip+16位的偏移地址)
Jmp far ;(CS:ip)
JCXZ ;(CX!=0 则做短转移)
Je 等于就转移
Jne 不等于就转移
Jb 小于就转移
Jnb 不小于就转移
Ja 大于就转移
Jna 不大于就转移
MOVSB ((ES)*16+(DI)) = ((DS)*16+(SI)) 如果DF=0 si++ di++ 如果=1 si—di—(此条指令用于两个数据段转移数据 每次一个字节 SI DI移动一位)
MOVESW 同上 每次SI DI一个字
- 一般
MOV AL,[0] ;(从存储单元DS:[0]中取一个字节到AL)
MOV AX,[0] ;(从存储单元DS:[0]中取一个字到AX)
Push 先SP-2 再入栈
Pop 先出栈 再SP+2
(一个段的最大值 偏移地址是16位,则为2的16次方,每个存储单元1Byte 所以为 64KB)
Idata 常量
--程序返回 程序后台COMMAND 将程序载入内存 运行完之后返回
MOV AX,4COOH
INT 21H
---over
DB 200 dup(0) 重复200个0(DB字节)
--CALL 与RET
CALL è push ip ,Jmp near ptr标号
CALL far ptr è PUSH CS ,PUSH IP ,Jmp far ptr 标号
RET èPOP IP
RETF è POP IP ,POP CS
OFFSET 取偏移地址
SEG 取段地址
DIV 被除数放在DX AX è除数是16位 AXè除数是8位 (8位即在2的8次方255之内)
MUL AL è保存到AX(即乘数是8位之内) DX,AX(乘数是16位的时候)
ADC A,B (A+B+CF)加了一个进位标志位 一般都是先从低位加(有进位标志位了) 再到高位
CMP 减法不保留结果只改变进位标志位
CLD DF置0
STD DF置1
PUSHF 标志寄存器的值入栈
POPF 标志寄存器的值出栈
IRET 指令返回源程序
*中断指令(看了一大半 后面的没看了)
0000:0000 到0000;03FF 大小共1024个单元 没个中断入口地址为2个字(4个存储单元 高地址存段地址,低地址存偏移地址) 1024/4 = 256个中断入口