汇编复习笔记

来源:互联网 发布: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中jmp

div 参数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完成循环功能,

adc 参1,参2进位加法指令 参1=参1+参2+CFsbb 参1,参2参1=参1-参2-CFcmp 参1,参2参1-参2    不保存计算结果,只会改变ZF位,配合jcxz 完成if命令je,jne,jb,jnb,ja,jna比较跳转 e=equal ne=not eual b=below a=above   |||||     配合cmp 命令完成一系列的比较转移 就是 if(XX) if(!XX)
标志位(标志寄存器):

 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..)

原创粉丝点击