8086编程模型

概括:Intel的芯片具有良好的兼容性,8086和80386是两个典型的代表,以下介绍8086的编程模型。

一、寄存器

寄存器是对CPU硬件的抽象,指令系统是CPU功能的抽象。

1.1、以下是CPU寄存器组结构图:

1.2、寄存器概述

不同的寄存器配合不同的指令来完成各种操作,所有的寄存器都是16位,其中AX,BX,CX,DX的高低8位可以单独访问。

AX,BX,CX,DX是数据寄存器,CS,DS,SS,ES是段寄存器,IP是指令指针寄存器,SP,BP,SI,DI是数据指针寄存器,FLAG 是运算结果标志寄存器。

二、存储器接口

8086只能工作在实模式下,也就是不提供虚拟地址的机制,有20根地址线,所以能访问的地址范围是1M,而寄存器是16位,无法直接寻址1M的地址范围,所以用两个寄存器来访问,具体的方法如下:

2.1、把1M的空间分成段,每段的粒度是16字节,每段最大为64KB。

2.2、这样就可以通过CS,DS,SS,ES来存储段号,而用SP,BP等来存储偏移,就可以达到寻址1MB空间的目的。

2.3、为什么粒度必须是16字节?

     因为如果粒度小于16字节的话,段号就有可能超过64KB,无法用16bit的寄存器表示,而如果粒度大于16字节的话,则很有可能会造成空间浪费,如果粒度设置为可变的话,则还需要另外的寄存器来存储粒度,会造成效率和空间的极大浪费。

三、寻址方式

3.1、立即数寻址,操作数位于代码段中,mov ax,1234h

3.2、寄存器寻址,操作数位于寄存器中,mov ax,bx

3.3、存储器寻址,操作数位于存储器中

★直接寻址,直接给出地址,mov ax,[1234h];mov ax,es:[1234h],如果没有指明地址所在段,则默认为DS。

★寄存器间接寻址,地址偏移量在寄存器中,和直接寻址类似,mov ax,es:[bx] 

★寄存器相对寻址,mov ax,es:[bx+1234h]  可以实现访问一维数组的某一元素

★基址加变址方式,mov ax,[bx+di]  可以实现遍历一维数组

★相对基址加变址,mov ax,[bx+di+1234h]  可以实现访问二维数组的某一元素

        基址只能使用 bx,bp,bp默认对应ss段,变址只能使用si,di

3.4、寻址方式总结

★存储器内部不能直接的传输数据是显而易见的,因为必须要CPU的参与才能完成数据的传输。

★存储器的寻址就是段的指定和偏移量的指定,其中偏移量的指定有几种方式,灵活应用即可。

 

四、指令系统  [Label:] Operator [Operand1[,Operand2]][;comment] 

4.1、指令总结如下图: 

4.2、条件跳转

条件跳转指令根据FLAG的相关标志位的结果进行跳转,跳转范围在-126-129之间,总结如下图:

五、伪指令

所谓伪指令就是不直接对应80x86的一条特定的指令,它的作用是为汇编器或者链接器提供程序的辅助信息,总结如下图:

5.1、段定义详解


六、dos功能调用

assume cs:codeseg  
  
codeseg segment  
  
 mov al,97 ;参数 
 mov ah,2   ;功能号 
 int 21h     ;dos调用
 mov ah,4ch  
 int 21h  
  
codeseg ends  
  
end 

七、中断

7.1、中断向量表大小为1024byte,每4byte代表一个中断入口地址,低字表示偏移,高字表示段号,为了容易寻址中断向量表,中断向量表位于地址0处。

7.2、通过 dos的35号调用,入口参数为中断号,es,bx将得到中断入口地址的段号和偏移。(当然也可以自己查)

7.3、中断返回用iret



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
古老的8085汇编器 看看先贤们在古老的年代(作于1988年)所写的古老的8085汇编器(BTW:8085是intel的8位的微处理器,比8086/8088还要古老),明显的2遍扫描的处理方式,将汇编语言转换为机器语言,输出文件为.lst和.hex文件。 代码结构简洁,有效文件仅有6个,容易研读和分析,研读时候需要找到8085的datasheet,以便分析每条指令的意义和程序的汇编过程。 asm80 |-- [Apr 21 1988] Makefile |-- [Apr 21 1988] README |-- [Apr 21 1988] as81.c |-- [Apr 21 1988] as82.c |-- [Apr 21 1988] as83.c |-- [Apr 21 1988] as85.c |-- [Apr 21 1988] asm.c |-- [Apr 21 1988] asm.h |-- [Apr 21 1988] asm80.1 `-- [Apr 21 1988] asm80.doc 0 directories, 10 files 代码包含有3个压缩文件 -rw-r--r-- 1 root root 25362 Dec 4 2001 asm80.tar.Z -rw-r--r-- 1 root root 16795 Oct 7 23:57 asm80.tar.gz -rw-r--r-- 1 root root 21523 Oct 18 12:56 asm80-121018.tar.gz 其中的asm80.tar.Z是原封不动的原始的代码用Linux环境下的编译器稍微做改动放可编译通过 解压方式: tar zxvf asm80.tar.Z 其中的asm80.tar.gz是稍微做改动可在Linux环境下的编译器编译通过的代码包,改动点只有一处, 位于asm.h文件的15行,改动如下(原有的代码注释保留,改动后的放在其下面。): //#define putback(c) ((c) != '\0' && --sptr < sbuf && abort()) #define putback(c) ((c) != '\0' && --sptr < sbuf && ({abort();0;})) //snallie@tom.com, Sun Oct 7 22:38:47 CST 2012 编译过程如下 [root@localhost dd]# tar zxf asm80.tar.gz [root@localhost dd]# cd asm80 [root@localhost asm80]# make cc -O -c -o asm.o asm.c cc -O -c -o as81.o as81.c cc -O -c -o as82.o as82.c cc -O -c -o as83.o as83.c cc -O -c -o as85.o as85.c cc -O asm.o as81.o as82.o as83.o as85.o -o asm80 使用asm80 汇编a.asm,生成a.lst以及a.hex [root@localhost asm80]# ./asm80 -l a.asm Total bytes assembled = A20D [root@localhost asm80]# more a.lst a.asm KSE cross assembler for the 8080 page 1 1 ; 2 ; a.asm , a 8080 asm source file 3 ; snallie@tom.com 4 ; Sun Oct 7 22:38:47 CST 2012 5 ; 0100 6 org 100H 0100 7 start: 0100 160A 8 mvi d, 0AH 0102 0E0B 9 mvi c, 0bH 0104 3E00 10 mvi a, 0 0106 CD00A2 11 call subRoutine 0109 00 12 nop 010A C30E01 13 jmp exit 010D 00 14 nop 010E 15 exit: 010E 76 16 hlt 17 A200 18 org 0a200H A200 19 subRoutine: A200 80 20 add b A201 81 21 add c A202 00 22 nop A203 C9 23 Ret 24 A204 25 bufByte: A204 01 26 db 1 A205 27 bufWord: A205 01000200 28 dw 1,2,3,4 A209 03000400 A20D 29 End start ^L a.asm Symbol table dump Page 1 bufbyte = A204 bufword = A205 start = 0100 exit = 010E subroutine = A200 ^L [root@localhost asm80]# more a.hex :0F010000160A0E0B3E00CD00A200C30E010076C2 :0DA20000808100C90101000200030004007C :00000000 [root@localhost asm80]# 其中的asm80-121018.tar.gz对代码做了加大改动,并加入的测试的用例及研读的注释,增加的若干的伪指令。 这个编译器的指令表为对指令名按字典序排序的,需要增加新的伪指令是要注意,加入新指令后仍然要保持按字典序排序。 === 古老的经典代码,让你温故而知新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值