汇编 寄存器和栈

原创
2018/04/25 21:50
阅读数 21

寄存器reg

ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di 

段寄存器

ds, ss, cs, es

 

bx,si,di,bp
在[...]中,这4个寄存器可以单个出现,或者以四种组合出现
bx,si
bx,di
bp,si
bp,di
正确
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]


错误
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]

 

CPU用16位寄存器来存储一个字,高8位存放高位字节,低8位存放低位字节,在内存中存储时,由于内存0单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存0单元来存放这个字的低位存放在低地址单元中,高位字节存放在高地址单元中

1234H在寄存器和内存中的存放方式

 

读取内存的方式

mov bx,1000H
mov ds,bx
mov al,[0]
将10000H=1000H:0中的数据读取到al中
[0]表示偏移地址

只能通过这个方式修改ds的值,不能使用立即数
mov ds,ax

 

mov 指令形式

mov ax,8
mov ax,bx
mov ax,[0]
mov [0],ax
mov ds,ax
mov ax,ds
mov [0],cs
mov ds,[0]

 

栈在内存中的表示

    mov ax,d
   	push ax

栈的操作是以字为单位的,所以步进为2

SS栈顶的段地址

SP栈顶的偏移地址

任意时刻,SS:SP指向栈顶元素

 

入栈时栈顶由高地址向低地址增长

 

如果将10000H--1000FH作为栈空间

则SS:1000H,sp:0010H

 

push 指令执行步骤

1,sp=sp-2

2,向SS:SP指向的字单元中送入数据

 

pop指令执行步骤

1,从SS:SP指向的字单元中读取数据

2,SP=SP+2

 

使用栈在10000H处写入字型数据2266H

mov ax,1000h
mov ss,ax
mov sp,2
mov ax,2266h
push ax

 

栈最大容量为64K,当栈满时执行压栈操作,栈顶将环绕,覆盖原来栈中的内容

 

将寄存器置为0

sub ax,ax  机器码2个字节
mov ax,0 机器码3个字节

 

SI和DI

si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用,下面三种方式等价

mov bx,0
mov ax,[bx]

mov si,0
mov ax,[si]

mov di,0
mov ax,[di]

 

寻址方式

[idata] 用常量表示地址,用于直接定位一个内存0单元
[bx] 用一个变量表示内存地址,可以间接定位一个内存地址0
[bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存0单元
[bx+si] 用两个变量表示地址
[bx+si+idata] 用两个变量和一个常量表示地址

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部