原文链接: 汇编 寄存器和栈
上一篇: 汇编 基础概念
下一篇: IDEA Junit 测试
寄存器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] 用两个变量和一个常量表示地址