汇编学习--常用寄存器功能介绍(基于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

相关文章

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat