1、8086有四个段寄存器CS、DS、SS、ESCS为代码段寄存器,IP为指令指针寄存器。任意时刻,设CS中内容为M、IP中内容为N,8086CPU从内存M16+N读取一条指令执行不能用mov修改CS、IP,因为8086CPU没有提供这样功能,可用指令JMP 段地址:偏移地址。JMP 2AE3:3 JMP AX 修改IP第三章寄存器(内存访问DS数据段寄存器。不能将数据直接送入段寄存器,所以MOV DS, 1不正确字在存储时要两个连续的内存单元,低位在低地址,高位在高地址address表示一个偏移地址为address的内存单元SS:SP指向栈顶元素PUSH AX:(1SP = SP - 2;(2A
2、X送入SS:SPPOP AX:(1SS:SP送入AX;(2SP = SP + 2PUSH/POP 寄存器PUSH/POP 段寄存器PUSH/POP 内存单元第四章第1个程序可执行文件包含两部分:程序和数据,相关的描述信息程序加载后,ds中存放这程序所在内存区的段地址,这个内存区的偏移地址为0,策程序所在的内存区的地址为ds:0;这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信。从256字节处向后的空间存放的是程序。第五章BX和loop指令BX表示一个内存单元,它的段地址在ds中,偏移地址在bx中。MOV AX,BX MOV AL,BX MOV BX,AXloop要进行两步操
3、作,CX=CX-1;判断cx中值,不为零则转至标号处执行程序,为零则向下执行。masm将指令mov ax,0 当作mov ax,0 处理解决方法可以为mov bx,0 使用寄存器mov ax,bx或mov ax,ds:0 直接给出段地址所在的段寄存器loop中不可使用mov cx,cx第六章包含多个段的程序dw 定义字型数据end 标号定义程序入口点定义多个段,同定义代码段相同。定义仅仅是为了程序阅读方便assume cs:code,ds:data,ss:stack是伪指令,将定义的具有一定用途的段和相关的寄存器联系起来对于段,如果数据占N个字节,则程序加载后实际占有空间为:(N/16+1*1
4、6,N的16整数第七章更灵活的定位内存地址的方法and 按位与and al, 0EFhor 按位或or al, 20h字母大小写转换:大写(xx0x xxxxand al, 0EFh小写(xx1x xxxxor al, 20hmov ax,200+bx = mov ax,bx+200 = mov ax,200bx = mov ax,bx.200 段地址为ds,偏移地址为bx+200si和di示8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用一般来说,在需要暂存数据的时候,都应该使用栈第八章数据处理的两个基本问题bx,si,di,bp1。在8086CPU中,只有这4
5、个寄存器可以用在.中来进行内存单元的寻址正确:mov ax,bx | mov ax,bp错误:mov ax,cx | mov ax,dx | mov ax,ax | mov ax,ds2。在.中,这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp 和si、bp和dimov ax,bx+bp | mov ax,si+di3。只要在.中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中mov ax,bp ax=ss*16+bp(取地址值在没有寄存器名存在的情况下,用操作符X ptr 指明内存单元的长度,X在汇编指令中可以位word或byte:mov wor
6、d ptr ds:0,1 | add word ptr bx,2 | inc byte ptr ds:2div,除法指令div 除数除数8位16位被除数AX DX-高16位AX-低16位商AL AX余数AH DXdd 伪指令,定义双字dworddup 伪指令,用来进行数据的重复db 3 dup (0 = db 0,0,0db 3 dup (0,1,2 = db 0,1,2,0,1,2,0,1,2db 3 dup (ab,CD = db abCDabCDabCD第九章转移指令的原理可以修改ip,或同时修改cs和ip的指令统称为转移指令8086CPU的转移行为有一下几类:只修改ip时,称为段内转移
7、,如jmp ax同时修改cs和ip时,称为段间转移,如jmp es:dx由于转移指令对ip的修改范围不同,段内转移又分为:短转移和近转移短转移ip的修改范围为-128127近转移ip的修改范围为-32768327678086CPU的转移指令分为以下几类:无条件转移指令(如jmp条件转移指令循环指令(如loop过程中断offset 取得标号的偏移地址jmp short 标号实现段内短转移,对ip的修改范围为-128127 对应机器码中包含转移的位移EB地址jmp near ptr 标号实现段内近转移,对ip的修改范围为-3276832767 对应机器码包含转移的位移jmp far ptr 标号实
8、现段间转移对应机器码中高地址为段地址,低地址为偏移地址EA偏移地址段地址jmp word ptr 内存单元地址(段内转移jmp dword ptr 内存单元地址(段间转移高地址存放目的段地址,低地址存放目的偏移地址jcxz 标号cx为0时跳转所有有条件跳转指令都是短转移,对ip的修改范围都为-128127loop 标号所有循环指令都是短转移,对ip修改范围都为-1281278025彩色字符显示模式显示缓冲区结构:内存地址空间中,B8000hBFFFFFh共32KB的空间,为8025彩色显示缓冲区。向这个地址写入数据,写入的内容将立即出现在显示器上。在8025彩色字符模式下,显示器可以显示25行
9、,每行80个字符,每个字符可以有256种属性。一个字符在缓冲区占两个字节,一屏内容共占4000个字节。显示缓冲区分8页,每页4KB,显示器可以显示任意一页的内容,一般显示第0页,即B8000hB8F9Fh。在一行中,一个字符占两个字节的存储空间,低位字节存储字符的ASCII码,高位字节存储字符的属性,一行80字符,占160字节属性字节的格式:7 6 5 4 3 2 1 0BL(闪烁RGB(背景I RGB(前景显示在M行N列的字符为B800:160*M + 2*N第十章call和ret指令ret用栈中数据修改ip,实现近转移(ip = (ss * 16 + (sp(sp = (sp + 2相当于
10、:POP ipretf用栈中数据修改cs和ip,实现远转移(cs = (ss * 16 + (spPOP cscall指令,call指令不能实现短转移,实现转移的方法和假名牌指令原理相同call 标号,段内转移机器指令中没有转移的目的地址,而是相对于当前ip的转移位移(补码,相当于 1.push ip 2.jmp near ptr 标号call far ptr 标号,段间转移机器指令中包含转移目的地址,相当于 1.push cs 2.push ip 3.jmp far ptr 标号call 16位寄存器相当于1.push ip 2.jmp 16位寄存器,机器指令不包含目的地址注意:1.push
11、 ip ip先变成call后第一个字节的偏移地址,然后入栈4。call word ptr 内存地址相当于1.push ip 2.jmp word ptr 内存地址5。call dword ptr 内存地址相当于1.push cs 2.push ip 3.jmp dword ptr 内存地址2.push ip ip先变成call后第一个字节的偏移地址,然后入栈mul 指令,乘法 a ba 8位16位b AL AX结果AX 高位DX,低位AX第十一章标志寄存器11 10 9 8 7 6 4 2 0OF DF IF TF SF ZF AF PF CFZF 零标志位,如果运算结果为零,则ZF=1PF
12、奇偶标志位,相关指令执行后,1 的个数为偶数PF=1SF 符号标志位,执行后,计算结果为负SF=1CF 进位标志位,无符号加减发生最高有效位之外的进、接位时CF=1OF 溢出标志位,有符号运算发生溢出时CF=1adc 带进位加法,adc ax,bx = (ax=(ax+(bx+CFsbb 带借位减法,sbb ax,bx = (ax=(ax-(bx-CFcmp 比较指令,相当于减法,但是不保存结果,只影响标志寄存器cmp ax,bx无符号比较时:ax=bx, ZF=1axbx, ZF=0 bx, CF=1ax bx, CF=0 and ZF=0=bx, CF=1 or ZF=1=bx, CF=0
13、有符号比较时(反向说明cmp ah,bh:SF=0 and OF=0, ah=bhSF=0 and OF=1, ah bhSF=1 and OF=0, ah无符号比较跳转指令je, ZF=1jne, ZF=0jb, CF=1jnb, CF=0ja, CF=0 and ZF=0jna, CF=1 or ZF=1DF 方向标志位,在串处理指令中,控制每次操作后si di的增减,DF=1 操作后si di递减使用cld,std设置:cld, DF=0. std, DF=1movsb 将ds:si内存单元字节送入es:dimov es:di, byte ptr ds:si ;非8086指令DF=0:
14、inc si, inc diDF=1: dec si, dec di类似的还有movsw,传送一个字一般使用格式为rep movsb相当于s:movsb, loop s,所以要在之前设置cxpushf 将标志寄存器值入栈,popf 将标志寄存器值出栈标志寄存器在debug中的表示0 OV DN NG ZR PE CY 1 NV UP PL NZ PO NC OF DF XX SF ZF XX PF CF 第十二章 内中断 中断类型码: 除法错误:0 单步执行:1 int0 指令:4 int n:n 中断向量表 0000:00000000:03E8, 1000 个单元, 号中断偏移地址为 4N,
15、 N 段地址为 4N+2, 高地址为段地址,低地址为偏移地址 中断处理过程: 1.取得中断类型码 N 2.pushf 3.TF=0, IF=0 4.push CS 5.push IP 6.ip=4N, cs=4N+2 中断处理程序的编写和子程序类似,常规步骤为: 1.保存用到的寄存器 2.处理中断 3.恢复用到的寄存器 4.用 iret 返回(iret = pop ip, pop cs, popf) 第十三章 int 指令 10 中断 mov ah, 2 ;置光标,2 号子例程为设置光标位置 mov bh, 0 ;第 0 页 mov dh, 5 ;行号 mov dl, 12 ;列号 int 1
16、0h -mov ah, 9 ;9 号子例程为在光标位置显示字符 mov al, a;字符 mov bl, 7 ;颜色属性 mov bh, 0 ;第 0 页 mov cx, 3 ;字符重复个数 int 10h 第十四章 端口 端口的读写只能用 in(读入)和 out(写入) 在 in 和 out 指令中,只能使用 ax 或 al 来存放从端口中读入的数据或要发送到端口中的数 据。访问 8 位端口时用 al,访问 16 位端口时用 dx in al, 20h ;从 20h 端口读入一个字节 out 20h,al ;向 20h 端口写入一个字节 mov dx, 3F8h ;端口号送入 dx(16 位
17、) in al, dx ;读入一个字节 out dx, al ;写入一个字节 第十五章 外中断 PC 机键盘处理过程 扫描码端口为 60h,断码 = 通码 + 80h 键盘输入到达 60h 端口时,相关芯片发送 9 号中断,如果这时 IF=1,则响应中断 BIOS 提供 int 9 中断例程,用来进行基本的键盘输入处理 1.读出 60h 端口中的扫描码 2.如果时字符键的扫描码,将扫描码对应的 ASCII 码送入内存中 BIOS 键盘缓冲区;如果是 控制键,将其转为状态字节写入 0040:17 单元 BIOS 键盘缓冲区中,一个键盘输入用一个字单元存放,高位存放扫描码,低位存放 ASCII 码
18、 状态字节含义: 0 右 shift,1 表按下 1 左 shift,1 表按下 2 ctrl,1 表按下 3 alt,1 表按下 4 ScrollLock,1 表灯亮 5 NumLock,1 表灯亮 6 CapsLock,1 表输入大写字母 7 Insert,1 表处于删除状态 第十六章 直接定址表 a db 1,2,3 以这种方式定义的标号 a 不但表示内存单元的地址,还表示内存单元的长度,即 a 处单元 是一个字节单元 mov al, asi 相当于 mov al, cs:0si mov al, a3 相当于 mov al, cs:03 assume 将标号所在段和一个段寄存器联系起来,
19、否则编译时无法确定标号的段地址 assume ds:data data segment a db 1,2,3 b dw 0 data ends code 段中可以使用 mov al, asi 相当于 mov al, si seg 取得标号的段地址 a db 1,2 b dw 0 c dd a,b ;相当于 c dw offset a, seg a, offset b, seg b int 16h 读取键盘缓冲区 mov ah, 0 int 16h int 13h 对磁盘进行读写 (ah=int 13h 的功能号,2-读扇区,3-写扇区 (al=读取/写入的扇区数 (ch=磁道号 (cl=扇区号 (dh=磁头号(面) (dl=驱动器号 0:软驱 A 1:软驱 B 80h:硬盘 C 81h:硬盘 D es:bx 指向数据区,读入/写入的数据 返回值:(al=读入/写入扇区数,(ah=返回码,0 表成功 本 文 来 自 CSDN 博 客 , 转 载 请 标 明 出 处 :
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1