汇编复习笔记
来源:互联网 发布:js按钮取消点击事件 编辑:程序博客网 时间:2024/06/05 23:52
汇编指令:
mov 参1,参2将参2放置参1处 参数形式:寄存器,立即数, [BX(SI|DI)+立即数]含义是bx+立即数=偏移地址等价格式 [bx].立即数add 参1,参2 参2和参1相加结果放入参1中sub 参1,参2参1-参2 结果放入参1中inc 参1 参1数值自增1dec 参1 参1数值自减1div 参数1,参数2除法指令:除数:在内存单元或者寄存器中 被除数:默认放在AX(16位)或者 AX(低16位)和DX(高16位) ,结果放在al(商) ah(余数) 或者 ax商 dx余数mul 参数1,参数2乘法指令:两个成数的位数必须想通 8位:数据在 al 和 内存单元 结果:ax中 16位:数据在内存单元中,结果:高16位DS中低16位AX中jmpdiv 参数1,参数2
jmp 合法寄存器 修改ip的值 jmp 段地址:偏移地址 修改cs和ip的值
段间转移 jmp short 标记(8位位移-128~127) jmp near ptr 标记(16位位移) jmp word ptr 内存单元地址(8位位移,一个字节)
段键转移 jmp far ptr 标记 jmp dword ptr 内存单元地址(16位位移,连续的两个内存单元,高地址作为段地址,低地址作为偏移地址)
ret 使用栈中的数据更改IP(段间转移) ,并使栈的偏移地址SP+2 相当于pop ipretf 栈的第一个16位改变IP 第二个十六位改变CS 并使栈的偏移地址SP+4 相当于 pop ip pop cscall将当前的ip和cs(call指令的下一条指令的IP和CS)入栈
1.call 标记 没什么好说的16位位移
2.call far ptr 标记 段间转移 相当于 push cs,push ip,jmp far ptr 标记
3.call 寄存器 相当于1
4 call word ptr 内存单元地址 相当于 push ip jmp word ptr 内存单元地址
5 call dword ptr 内存单元地址 相当于 push CS,push IP, jmp dword ptr 内存单元地址
jcxz 标记 8位位移,根据CX是否为0决定是否转移,0的时候进行转移loop 指令:格式:loop 标记
操作:寄存器cx中的数据-1 判断cx中的数据是否为零,不为零跳转到标记处,为零则继续向下运行程序 PS:loop命令在跳转前先减1,然后再判断
可以用loop配合cx完成循环功能,
标志位(标志寄存器):
ZF(zero flag)标志 :第6位 表示计算结果是否为0 结果为0则ZF为1 否则为0 可以改变ZF标志的命令为inc div mul dec add sub..计算命令
PF(parity flag)标志 : 第2位 表示计算结果是否是2的倍数 是则PF位为1 否则为0
SF(sign flag)标志:第7位 表示计算结果是否为负数 是为1否则为0
CF(carry flag)第0位 表示当计算结果是否需要进位是为1否则0 进位发生在无符号计算 无符号就证明只有加号不会出现减号 所以不会出现超过-127这种低过下线的计算,所以只会出现进位"溢出",不会发生退位"溢出"
OF(overflow flay) 第11位 表示计算结果存储不下时存放溢出发生在有符号计算 正好和上面相反
1.8086的通用寄存器
8086的16位寄存器有AX,BX,CX,DX
其作用分别为 AX:累加 BX:基址 CX:计数 DX:数据
8086的8位通用寄存器ah,al bh bl ch cl dh dl 其实就是16位通用寄存器的高位8位和低8位
一个16位寄存器可以存储16位(bit)数据 2个字节(byte)
SI和DI 近似于BX 但是不能分割成两个8位
2.8086物理地址
物理地址=基础地址(段地址*16)+偏移地址
段地址*16 必然是16的倍数,所以一个段的起始地址一定是16的倍数;偏移地址必然为16位,16位可以表示2的16次方的内存单元也就是64kb,所以一个段最大为64KB
3 段寄存器
8086的段寄存器有CS DS SS ES
3.1 CS和IP
CS和IP是8086的最关键的寄存器,它们指示了CPU当前要读取指令的地址.CS为代码段寄存器 IP为指令指针寄存器
当CS为M IP为N 则cpu从M*16+N处开始执行
如何改变CS和IP的地址JMP命令:
使用jmp 段地址:偏移地址
jmp 合法寄存器 (改变IP的信息)
4.debug 的使用
debug功能选项:
-r 查看,改变CPU寄存器的内容
-d 查看内存的内容 (-d 段地址:偏移地址 )
-e 改写内存中的内容(-e 段地址:偏移地址 改变数1 改变数2 改变数3 ....) 也可以 (-e 段地址:偏移地址) 然后输入要该的值
-u 将内存中的机器指令编译成汇编指令 (u 段地址:偏移地址)
-t 执行一条机器指令(-t 汇编命令)
-a 以汇编的格式向内存中插入一条指令 (-a 段地址:偏移地址)
5.寄存器(内存的访问)
1个字节(byte)16位占用2个存储单元 存储1个字节的数据则 低8位在低的内存单元中 高8位在高的内存单元中
6 DS 和 [Address]
DS通常存放要访问的数据的段地址,[address] address是立即数或寄存器是数据的偏移地址 比如 mov ax,1000 mov ds,ax mov ax,ds:[0] 此3句汇编代码是将 段地址为1000 偏移地址为0起始的16位数据放入ax寄存器中
PS:8086 不准将数据直接送入段寄存器,ds和cs是段寄存器 注意debug的时候不能使用ds:[0]的形式 应该使用ds[0]的形式
7 栈
push (数据|寄存器) 入栈 pop (寄存器|内存单元) 出栈
PS:8086栈的入栈和出栈都是以 字(16位 2个byte)做为单位进行的,其存放形式和内存中的16位数据存储是一样的 高地址存放高位,低地址存放地位
8086使用段寄存器SS和寄存器SP即 SS:SP时时刻刻指向的是栈顶元素,即使用pop每次出栈的数据都是以SS:IP起始的16位数据, pop,和push 都会改变 SS:SP的值
push执行2步: SP=SP-2 将 SS:SP将数据存入SS:SP起始的内存单元
pop 执行2步: 将SS:SP起始的16位数据出栈, SP=SP+2
就是低地址存储新近的数据,高地址存放最先进的数据
PS:8086不会控制栈的大小,但最多不能超过64KB,因为8086是16位寻址最大也只能寻这么多的地址
8 源程序
伪指令:
段名 segment 汇编代码 段名 ends
end 标记 汇编程序结束 汇编编译器遇到这个伪指令会停止编译,并将程序入口设置为 标记 处
assume 将某一个段寄存器和程序中的某一个段关联起来 比如 assume ds:codes 将codes段和ds段寄存器关联起来,codes是用segment...ends伪指令指定的
offset 标记 获取 标记处的偏移地址
标号:
segment前面的段名其实就是个标记,一个标记通常指代了一个地址,段名就是整个程序段的起始地址
最简单的程序结构
assume cs:abc 非必须,将abc代码段于cs段寄存器关联abc segment abc 段的开始, mov ax,2 mov bx,ax....汇编代码 程序返回代码(必须) mov ax,3c00H int 21Habc ends abc段的结束end 程序结束
dw,db,dd
dw 参1,参2,参3,定义一个字(16位)的数据,即参1,参2,参3 都是16位的数据
db '英文字符串' 或 db 'a' ,'b' 或 db FFH,11H8位数据
dd 参1,参2,参3 定义双字(32位)
dup:定义重复的dw db dd 语法: db 重复次数 dup (值1,值2,值3..)
- 汇编复习笔记
- 汇编复习笔记系列
- 汇编学习笔记-复习loop与[]-inc
- 汇编--学习笔记(十五)-总复习
- 汇编复习
- 复习下下汇编
- NASM汇编指令复习
- NASM汇编指令复习
- 汇编原理复习
- 嵌入式ARM汇编复习
- 汇编寄存器的复习
- 170331 汇编-寄存器复习
- 汇编复习Test5
- 汇编复习Test6
- 汇编复习知识积累
- 复习常用的汇编指令
- windows 32 汇编寄存器复习
- 复习常用的汇编指令
- HDU 3068 ( 最长回文 )
- 跨计算机专业的10年路程--献给想跨专业的人士
- UISlider+UILable 实现对字体大小的设置
- php csv操作
- 无为而治
- 汇编复习笔记
- UITabBarController 之 设置选中和未选中的图片 隐藏tabbar
- 人吃人
- 深入理解js面向对象中的prototype
- 关于Android的Run as 不出现Android Application的问题
- SPOJ 1043
- 【100题】求1+2+……N的和(变态级限制)
- Brackets Sequence (P1141)
- java值传递以及引用传递