1、MOV BX, OFFSET TABLE 将TABLE的偏移地址送给BX。OFFSET位属性操作符
与 LEA BX,TABLE 相同
2、push pop 不能用立即数寻址方式,pop指令为段寄存器时,不允许是CS
3、XCHG指令中两个操作数不允许使用段寄存器。
4、类型转换指令 CBW CWD 影响条件标志位
5、CMP 和 SUB 指令一样执行减法。但是不保存结果,只是根据结果设置条件标志位。
8短,16近。 JMP中位移量位8位时为短跳跃,为16位时为近跳跃。
处理器(CPU),所能识别的就是一串二进制机器语言的代码
java 的抽象就是java虚拟机的抽象.
中文编码unicode 4个字节 ASCII 1个字节
PTR 属性操作符,可以制定操作数的类型属性,优先于隐含的类型属性。
Bit意为"位"或"比特",是计算机运算的基础;
Byte意为"字节",是计算机文件大小的基本计算单位;
1byte=8bits,两者换算是1:8
al 是 8比特,8位, 有低四位 高四位.1字节
汇编语言程序的语句除 治理了难过 意外还可以有 位操作和宏指令组成.
MOV传送的是地址所指的内容,而LEA只是地址。0
LEA REG,SRC
link 连接 库文件 ,和 目标文件成为 可执行文件 exe
SS:BP 堆栈
DS:SI
ES:DI
如果乘积结果的高半部分等于零,则CF=OF=0,否则CF=OF=1
简化段定义 mov ax,@data mov ds,ax
neg是求补指令
STOS 该指令把AL,AX,EAX中的值存入到由目的寄存器DI指向的附加段的某单元中,并根据控制标志位DF的值和数据类型修改目的变址寄存器的值。
LODS 该指令把源变址寄存器SI指向的数据段中某单元的内容送到AL,AX,EAX中,并根据控制标志位DF的值和数据类型修改源变址寄存器的值。
将段地址装入相应的段寄存器中
三、地址传送指令
(1) 格式:LEA REG,MEM
功能:将源操作数的有效地址传送到通用寄存器,操作数REG为16位或32位通用寄存器,源操作数为16位或32位存储器操作数。
例 3.21
LEA BX,BLOCK;将BLOCK的有效地址传送到BX中(16位)
LEA EAX,/[EBX/];将EBX内容(有效地址)传送到EAX中(32位)
一、字符串处理指令
(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI
(2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI
(3) movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI
(4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
(5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
(6) rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。
上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX
涉及的标志位:DF、AF、CF、OF、PF、SF、ZF
NOP 无操作指令 ,占一个字节的空间,调试的时候用
HLT 停机指令
ESC 换码指令
WAIT 使处理机处于空转状态
LOCK 前缀 维持总线的锁存信号
BOUND 界限指令
ENTER 建立堆栈帧
LEAVE 释放堆栈帧
SEGMENT 伪操作
MODEL 伪操作
状态标志 : 记录指令操作结果的标志, 共6位 : OF , SF ,ZF ,AF ,PF ,CF
控制标志 : 控制操作的标志,如DF位
段跨越前缀 ,如允许数据存放在除DS段以外的其他段中.
串处理指令的目的串必须用ES段
MOV AX,[BX][BP] 错误,BX和BP不能配对 可以修改为MOV AX,[BX][SI]
MOV AX,[BX][SI] 就是把DS*16+BX+SI中存放的数据传送到寄存器AX中
汇编中DUP和EQU指令的含义是什么?
s db 30 dup(0) 定义一个字节型变量,该变量占用30个字节,所有字节被初始化成0
在汇编定义变量的时候会用到dup。
变量名 类型 初值表
Dup用于把一个相同值赋值若干次。
重复次数 dup(数据项)
equ是一个代码替换指令
比如:
s equ bx+si
mov cx,[s]
那么上面两句代码相当于如下指令:
mov cx,[bx+si]
DF是程序状态寄存器中的控制标志位。
VAP1 DB ’12345’ ;定义VAR1为字节数据类型 5个字节
VAP2 DW 10 dup(?) ;定义VAR2为字数据类型 10个字
LEN EQU $-VAR1 ;符号定义 相当于len=$-var1 $为程序指针 这样就得到了已定义数据的长度 长度为 10*2+5
mov ax,seg buf 的执行,是把BUF所在段的地址送到AX中。
无符号数和带符号数的两组条件转换指令,每条指令都有完全扥小的两个指令助记符,例如,JL指令另一个指令助记符是JNGE
mov [si], ax表示将ax中的内容存入ds:si指向的内存单元,也就是说在寄存器间接寻址的情况下,以si间接寻址时总是默认以ds为相应的段地址寄存器。同样 di是以es为默认的段地址寄存器。DS:SI ES:DI
seg cs 这样的语句只影响到它下一条指令,比如在linux启动代码中的一段:
seg cs
mov sectors,ax 等价于mov cs:[sectors],ax seg cs只是表明紧跟它的下一条语句将使用段超越
mov ax,#INITSEG
CALL RET 指令都不影响条件码
INT 中断
INTO 如溢出则中断
IRET/IRETD 从中断返回
LOOP AGAIN 不影响标志位 循环指令不影响条件码
LOOPZ/LOOPE ZF=1且CX!=0
LOOPNZ/LOOPNE ZF=0且cx!=0