本文主要是介绍汇编学习--常用寄存器功能介绍(基于8086CPU),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
8086CPU常用的寄存器有AX,BX,CX,DX,DS,CS,ES,SS,IP,SP,SI,DI等。通过学习王爽老师主编的《汇编语言》(第二版)的4-7章,基本上对这些寄存器的使用有了一定的了解,现将这些寄存器的使用总结如下:
在汇编中使用描述符reg来表示一个寄存器,包括ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di
使用描述符sreg表示一个段寄存器,包括ds,cs,ss,es
-----------------------AX,BX,CX,DX,BP,SI,DI---------------------
AX,BX,CX,DX是四个通用寄存器,大小为1个字(两个字节),可以直接读取一个字的内容到这些寄存器中,也可以按字节的方式读取这些寄存器。
以AX为例,如果想要读取AX低位字节的内容,使用AL(A low),想要读取AX高位字节的内容,使用AH(A high)。
如果将1234H存入到AX中,使用mov ax,1234H。这里需要注意的是,34保存在低位,12保存在高位。如果将AX存入到DS中,查看DS内容时,会发现34在前,12在后。因为DS是从低位显示到高位的。
到目前为止,使用AX最多的是将一个内存中的值赋给AX,然后通过AX将内存中的值存入不同的段中(CS,DS,SS,ES等)。因为对这些段的赋值,8086CPU不允许通过内存直接赋值,只能通过一个变量寄存器来间接赋值。
DX的使用和AX类似,有区别的是BX和CX。
BX通常存放的数据用来表示的是数据段DS的偏移地址。如mov ax,[bx]默认的是将ds*16 + bx所表示的物理内存中的数据传递给ax。
CX在程序刚加载的时候,存放的是程序的长度。另外,在使用循环LOOP时,通常是将循环的次数存放在CX中(插一句,如果是多层循环的话,就要考虑使用stack来push和pop来不断的存取CX值,可能这也是stack结构最初的使用吧。现在想想,确实是个很不错的设计)。
DP存放的是段SS的偏移地址。
SI,DI 可以单独使用,若想组合使用只能和BX或者BP组合来使用,如[bx + si],[bp + di]等
----------------------DS,CS,SS,ES段--------------------------
DS存放的是程序在内存中的起始段的段地址。这个段内的前256个字节(100H)存放的是PSP内容(不懂,只了解是存放程序和DOS通信的内容),之后才是程序的第一条指令的地址。而CS:IP指向的是程序执行指令的地址,起始地址为CS:0000。故有DS + 10H = CS。
如上,CS存放的是程序的实际执行指令的段地址,IP存放的是当前执行指令的偏移地址。在debug调试状态下,可以通过使用-g cs:IP来控制程序具体执行到哪一行指令处。
SS和SP结合使用,SS存放的是栈Stack的段地址,SP存放的是栈顶位置的偏移地址。栈的介绍在http://blog.csdn.net/sunshaodong_1988/article/details/11214635
ES(尚未学习到,后续补充)
在一个程序中,通常将数据,代码和栈放在不同的段中。数据存放在DS段中,代码存放在CS中,栈存放在SS中。如下程序所示:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16H
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[0]
pop ds:[2]
mov ax,4c00h
int 21H
code ends
end start
-----------------------SI,DI-------------------------
SI和DI是和BX类似的两个寄存器,可以用来表示数据段的偏移地址。但是和BX不同的是,SI和DI不能拆分成两个8位寄存器来使用。
基于上面的解释,顺带把自己第七章7.9题的代码放上,作为理解使用:
assume cs:code,ds:data,ss:stack
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bx,0
mov cx,4
s0:
push cx
mov si,0
mov cx,4
s1:
mov al,[bx + si + 3]
and al,11011111b
mov [bx + si + 3],al
inc si
loop s1
pop cx
add bx,16
loop s0
mov ax,4c00h
int 21h
code ends
end start
这篇关于汇编学习--常用寄存器功能介绍(基于8086CPU)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!