汇编学习--常用寄存器功能介绍(基于8086CPU)

2023-11-05 15:08

本文主要是介绍汇编学习--常用寄存器功能介绍(基于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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350656

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug