当前位置:编程学习 > 汇编语言 >>

汇编语言基本概念(续1)

汇编中对内存地址提出了字概念,我们前面说过一个字节是8位,一个字是两个字节,正好是16位,对8086CPU来说,一个寄存器也是16位,正好就是一个字,因此内存也可以对应的划分成按字存储,即存放一个字型数据(16位),由两个连续地址单元组成的内存单元称之为字单元。

image

CPU要读写一个内存单元的数据,不是地址时,需要先知道内存单元地址,这时候就不用CS:IP方式,而是借用DS寄存器和mov 寄存器,[偏移地址]方式进行读写。8086CPU有一个奇怪的地方,就是DS不能直接MOV地址进入。需要借助其它通用寄存器方式进行传送。

image

常见指令介绍:

   mov 寄存器,数据   mov ax,1000

   mov 寄存器,寄存器   mov ax,bx

   mov 寄存器,内存单元 mov ax,[0]

   mov 内存单元,寄存器  mov [0],ax

   mov 段寄存器,寄存器  mov ds,ax

   mov 寄存器,段寄存器  mov ax,ds

   mov 内存单元,段寄存器 mov [0],cs

   mov 段寄存器,内存单元  mov ds,[0]

 

image

可以将一段长度为N(N小于等于61KB)的连续地址,起始为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段,将一段内存当数据段,是一种编程上的安排,在具体执行操作时,可将DS指向存放数据段的段地址,再根据需要,用相关指令取出内存中的数据。

image

image

image

内存初始化 CS=2000H IP=0 DS=1000H AX=0 BX=0,

使用R命令对寄存器进行初始化赋值。接着使用A命令在指定内存段写入汇编指令,再用t命令在指定CS段执行命令。

-r ax

AX 006F

:0

-r

AX=0000 BX=00FF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0001 ES=13FA SS=13FA CS=13FA IP=012A NV UP EI PL NZ NA PE CY

13FA:012A 0000 ADD [BX+SI],AL DS:00FF=C0

-r bx

BX 00FF

:0

-r ip

IP 012A

:0

-r ds

DS 0001

:1000

-r cs

CS 13FA

:2000

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1000 ES=13FA SS=13FA CS=2000 IP=0000 NV UP EI PL NZ NA PE CY

2000:0000 0000 ADD [BX+SI],AL DS:0000=A1

-a 1000:0

1000:0000 mov ax,2000

1000:0003 mov ds,ax

1000:0005 mov ax,[0008]

1000:0008 mov ax,[0002]

1000:000B

-a 2000:0

2000:0000 mov ax,6622

2000:0003 jmp 0ff0:0100

2000:0008 mov bx,ax

2000:000A

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1000 ES=13FA SS=13FA CS=2000 IP=0000 NV UP EI PL NZ NA PE CY

2000:0000 B82266 MOV AX,6622

-t

AX=6622 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1000 ES=13FA SS=13FA CS=2000 IP=0003 NV UP EI PL NZ NA PE CY

2000:0003 EA0001F00F JMP 0FF0:0100

-t

AX=6622 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1000 ES=13FA SS=13FA CS=0FF0 IP=0100 NV UP EI PL NZ NA PE CY

0FF0:0100 B80020 MOV AX,2000

-t

AX=2000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1000 ES=13FA SS=13FA CS=0FF0 IP=0103 NV UP EI PL NZ NA PE CY

0FF0:0103 8ED8 MOV DS,AX

-t

AX=2000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2000 ES=13FA SS=13FA CS=0FF0 IP=0105 NV UP EI PL NZ NA PE CY

0FF0:0105 A10800 MOV AX,[0008] DS:0008=C389

-d 2000:8

2000:0000 89 C3 00 00 00 00 00 00 ........

2000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0080 00 00 00 00 00 00 00 00 ........

-t

AX=C389 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2000 ES=13FA SS=13FA CS=0FF0 IP=0108 NV UP EI PL NZ NA PE CY

0FF0:0108 A10200 MOV AX,[0002] DS:0002=EA66

-t

AX=EA66 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2000 ES=13FA SS=13FA CS=0FF0 IP=010B NV UP EI PL NZ NA PE CY

0FF0:010B 1DFE0D SBB AX,0DFE

-d 2000:2

2000:0000 66 EA 00 01 F0 0F-89 C3 00 00 00 00 00 00 f.............

2000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2000:0080 00 00 ..

-

 

 

 

栈是一种具有特殊的访问方式的存储空间,它的特殊性在于,最后进入的数据,最后出去,也就是它是一个有底的盒子。8086CPU提供了入栈和出栈指令,PUSH(入栈)和POP(出栈)。8086CPU入栈和出栈都是以字为单位(16位)。

image

image

image

 

image

image

image

注意,字型数据用两个单元存放,高址单元存高8位,地址单元存低8位。对栈来说,CPU需要知道当前栈顶的位置,8086CPU中有两个寄存器,SS(段寄存器)和寄存器(SP),其中SS存栈顶的段地址,SP存放偏移地址。因此,任意时该,SS:IP都是指向栈顶内存。

image

image

image

从上图可以很清清楚楚,显示,在PUSH指令执行之前,SP就开始减2,在POP指令执行之前,SP就开始加2。从下图可以推出如下一个基本事实,当栈空时,栈的最后一个元素在被POP出之前SS:SP指向1000EH,当这个元素弹出后,SP+2指向0010H,不过这里有个极端,就是如果一个栈段设为最大的64K,也就是从0~

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,