汇编语言基本概念(续1)
汇编中对内存地址提出了字概念,我们前面说过一个字节是8位,一个字是两个字节,正好是16位,对8086CPU来说,一个寄存器也是16位,正好就是一个字,因此内存也可以对应的划分成按字存储,即存放一个字型数据(16位),由两个连续地址单元组成的内存单元称之为字单元。
CPU要读写一个内存单元的数据,不是地址时,需要先知道内存单元地址,这时候就不用CS:IP方式,而是借用DS寄存器和mov 寄存器,[偏移地址]方式进行读写。8086CPU有一个奇怪的地方,就是DS不能直接MOV地址进入。需要借助其它通用寄存器方式进行传送。
常见指令介绍:
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]
可以将一段长度为N(N小于等于61KB)的连续地址,起始为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段,将一段内存当数据段,是一种编程上的安排,在具体执行操作时,可将DS指向存放数据段的段地址,再根据需要,用相关指令取出内存中的数据。
内存初始化 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位)。
注意,字型数据用两个单元存放,高址单元存高8位,地址单元存低8位。对栈来说,CPU需要知道当前栈顶的位置,8086CPU中有两个寄存器,SS(段寄存器)和寄存器(SP),其中SS存栈顶的段地址,SP存放偏移地址。因此,任意时该,SS:IP都是指向栈顶内存。
从上图可以很清清楚楚,显示,在PUSH指令执行之前,SP就开始减2,在POP指令执行之前,SP就开始加2。从下图可以推出如下一个基本事实,当栈空时,栈的最后一个元素在被POP出之前SS:SP指向1000EH,当这个元素弹出后,SP+2指向0010H,不过这里有个极端,就是如果一个栈段设为最大的64K,也就是从0~
补充:软件开发 , 其他 ,
上一个:汇编语言基本概念(续2)
下一个:汇编语言基本概念
- 更多汇编语言疑问解答:
- 汇编汉字显示中add di ,32什么意思
- 求助,一段汇编代码
- 汇编小问题新手神马都不会啊~在线等~感激不尽~!
- 一道计算机组成原理题, 汇编指令MOV AX,[1010H],对应的机器指令编码为048B1010H,其中AX为寄存器寻址
- 把这个汇编语言逐句翻译下
- 求 int 3 这条汇编指令的解释?
- Proteus isis的问题(汇编)
- 51单片机用汇编语句编写 p1.7与一个开关键相连,p1.0--p1.5与六个LED灯相连,当p1.7被按下时p1.0--p1.2
- 用汇编语言将十进制数转换成二进制数,当被转换数大于65535会有什么结果
- 请问在自己的电脑上写汇编会有问题吗
- 怎么用汇编语言编程:在一串字符串中找"%",如果有输出Yes,如果没有输出No?
- 汇编语言宏定义是什么意思?可不可又用别的指令替换宏定义指令
- 编写汇编语言将1到5转换为二进制数
- 汇编语言里内存1000H开始存有20个无符号字节数据,编程计算其平均值
- 汇编语言的loop指令