更灵活定位内存地址的方法

news2025/7/19 19:11:39

更灵活定位内存地址的方法

文章目录

  • 更灵活定位内存地址的方法
    • 1.and和or
    • 2.以字符形式给出的数据
    • 3.[bx+idata]
    • 4.SI、DI与寻址方式的灵活应用


1.and和or

  1. and指令:逻辑与指令,按位进行与运算(同真为真)

    • 比如:

      mov al, 01100011B
      and al, 00111011B
      ;执行后:al=00100011B即都为1才为1
      
  2. or指令:逻辑或指令,按位进行或运算(同假为假)

    • 比如:

      mov al, 01100011B
      or al, 00111011B
      ;执行后:al=01111011B 即只要有一个为1就为1
      

2.以字符形式给出的数据

关于ASCII码在内存中的存储:

  1. 世界上有很多编码方案,有一种方案叫做ASCII编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在ASCII编码方案中,用61H表示“a”,62H表示“b”。一种规则需要人们遵守才有意义
  2. 在文本编辑过程中,我们按一下键盘的a键,就会在屏幕上看到“a”。我们按下键盘的a键,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化为61H存储在内存的指定空间中;文本编辑软件从内存中取出61H,将其送到显卡上的显存中;工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容
  3. 61H被当作字符“a”,显卡驱动显示器将字符“a”的图像画在屏幕上。我们可以看到,显卡在处理文本信息的时候,是按照ASCII码的规则进行的。这也就是说,如果我们要想在显示器上看到“a”,就要给显卡提供“a”的ASCII码,61H。如何提供?当然是写入显存中

比如:

assume cs:code,ds:data 

data segment 
	db 'unIx'   ;相当于“db 75H,6EH,49H,58H”
	db 'foRK'
data ends 

code segment
start:	mov al, 'a'  ;相当于“mov al, 61H”,“a”的ASCI码为61H;
		mov b1, 'b'
		
		mov ax, 4c00h 
		int 21h 
code ends
end start

关于字符在内存中大小写转换的问题:

  1. 小写字母的ASCII码值比大写字母的ASCII码值大20H
  2. 大写字母ASCII码的第5位为0,小写字母的第5位为1(其他一致),大小写相差32,即2^5。注:这里的位数是从0开始计算的

请添加图片描述

assume cs:codesg,ds:datasg 

datasg segment 
	db 'BaSiC'
	db 'iNfOrMaTion'
datasg end

codesg segment 
	start:	mov ax, datasg 
			mov ds, ax	;设置ds 指向 datasg段
		
			mov bx, 0	;设置(bx)=0,ds:bx指向’BaSic’的第一个字母
			
			mov cx, 5     	 ;设置循环次数5,因为’Basic'有5个字母
	s:		mov al, [bx]     ;将ASCII码从ds:bx所指向的单元中取出
			and al, 11011111B;将al中的ASCII码的第5位置为0,变为大写字母
			mov [bx], al	 ;将转变后的ASCII码写回原单元
			inc bx		     ;(bx)加1,ds:bx指向下一个字母
			loop s 
			
			mov bx, 5	;设置(bx)=5,ds:bx指向,iNfOrMaTion'的第一个字母
			
			mov cx, 11	;设置循环次数11,因为‘iNfOrMaTion'有11个字母
	s0:		mov al, [bx]
			or al, 00100000B;将a1中的ASCII码的第5位置为1,变为小写字母
			mov [bx], al 
			inc bx
			loop s0
			
			mov ax, 4c00h 
			int 21h 
codesg ends

3.[bx+idata]

[bx+idata]表示一个内存单元, 例如:mov ax, [bx+200],该指令也可以写成如下格式:

mov ax, [200+bx] ;将一个内存单元内容送入ax,这个内存单元的长度为2个字节,偏移地址为bx中的数值加上200,段地址在ds中,(ax)=((ds)*16+(bs)+200)

mov ax,[bx+200]	 ;其他格式
    
mov ax, 200[bx]  ;其他格式

mov ax, [bx].200 ;其他格式
    
;案例:用Debug查看内存,结果如下
;2000:1000H BE 00 06 00 00 00 ...
    
mov ax,2000H	
mov ds,ax
mov bx,1000H
mov ax,[bx]		;段地址:(ds)=2000H 偏移地址:(bx)=1000H  则(ax)=00BEH
mov cx,[bx+1]	;段地址:(ds)=2000H 偏移地址:(bx+1)=1001H 则(cx)=0600H
add cx,[bx+2]	;段地址:(ds)=2000H 偏移地址:(bx+2)=1002H 则(cx)=0606H

用[bx+idata]的方式进行数组的处理:

assume cs:codesg,ds:datasg 

datasg segment 
	db 'BaSiC';转为大写
	db 'MinIx';转为小写
datasg ends

codesg segment
	start:
		mov ax, datasg 
		mov ds, ax 
		mov bx, 0  			;初始ds:bx

		mov cx, 5
	s:	mov al, 0[bx]  
		and al, 11011111b 	;转为大写字母
		mov 0[bx], al 		;写回
		mov al, 5[bx]  		;[5 + bx]
		or al, 00100000b 	;转为小写字母
		mov 5[bx], al 
		inc bx
		loop s

		mov ax, 4c00h 
		int 21h
codesg ends
end start

C语言描述方式:

int main()
{
	char a[] = "BaSic";
	char b[] = "MinIX";

	int i = 0;

	do
	{
		a[i] = a[i] & 0xDF;
		b[i] = b[i] | 0x20;
		i++;
	} while(i < 5);

	return 0;
} 

4.SI、DI与寻址方式的灵活应用

  1. si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用

    assume cs: codesg, ds: datasg 
                   
    datasg segment 
    	db 'welcome to masm!' ;用si和di实现将字符串‘welcome to masm!"复制到它后面的数据区中。
    	db '................' ;db是ding'y
    datasg ends
                   
    codesg segment 
    	start:	mov ax, datasg 
    			mov ds, ax 
    			mov si, 0
                   
    			mov cx, 8
    	s:		mov ax, 0[si] ;[0 + si]
    			mov 16[si], ax ;[16 + si] 使用[bx +idata]方式代替di,使程序更简洁
    			add si, 2 
    			loop s 
                   
    			mov ax, 4c00h 
    			int 21h 
    codesg ends 
    end start
    
  2. [bx+si]和[bx+di]的含义相似:

    1. [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)
    2. 指令mov ax, [bx + si]的含义:将一个内存单元字数据的内容送入ax,段地址在ds中
    3. 该指令也可以写成如下格式:mov ax, [bx][si]
  3. [bx+si+idata]和[bx+di+idata]:

    1. [bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata
    2. 指令mov ax,[bx+si+idata]的含义:将一个内存单元字数据的内容送入ax,段地址在ds中
  4. 不同的寻址方式的灵活应用

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

;将datasg段中每个单词改为大写字母
assume cs:codesg,ds:datasg,ss:stacksg 

datasg segment
	db 'ibm            ' ;16
	db 'dec            ' 
	db 'dos            '
	db 'vax            '  ;看成二维数组
datasg ends 

stacksg segment ;定义一个段,用来做栈段,容量为16个字节
	dw 0, 0, 0, 0, 0, 0, 0, 0
stacksg ends 

codesg segment 
	start:	mov ax, stacksg 
			mov ss, ax
			mov sp, 16 
			mov ax, datasg 
			mov ds, ax 
			mov bx, 0 ;初始ds:bx

			;cx为默认循环计数器,二重循环只有一个计数器,所以外层循环先保存cx值,再恢复,我们采用栈保存
			mov cx, 4
	s0:		push cx	;将外层循环的cx值入栈
			mov si, 0
			mov cx, 3	;cx设置为内层循环的次数
	s:		mov al, [bx+si]
			and al, 11011111b ;每个字符转为大写字母
			mov [bx+si], al 
			inc si
			loop s 

			add bx, 16 ;下一行
			pop cx	;恢复cx值
			loop s0 ;外层循环的loop指令将cx中的计数值减1

			mov ax,4c00H 
			int 21H 
codesg ends
end start
			mov cx, 3	;cx设置为内层循环的次数
	s:		mov al, [bx+si]
			and al, 11011111b ;每个字符转为大写字母
			mov [bx+si], al 
			inc si
			loop s 

			add bx, 16 ;下一行
			pop cx	;恢复cx值
			loop s0 ;外层循环的loop指令将cx中的计数值减1

			mov ax,4c00H 
			int 21H 
codesg ends
end start

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

速锐得适配进口福特烈马BRONCO车载 CAN总线应用随动转向大灯改装

适配进口福特烈马BRONCO车载 CAN总线应用随动转向大灯改装&#xff0c;必须先获得福特烈马BRONCO的原厂电路图纸&#xff0c;为此&#xff0c;速锐得准备了福特诊断仪、福特烈马BRONCO原厂电路图纸工具&#xff0c;适配装置、CAN数据采集设备、软件及线缆等一系列工具。 我们首…

【附源码】Python计算机毕业设计石家庄学院跳蚤市场

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[数据结构]二叉树的链式结构

作者&#xff1a; 华丞臧专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。推荐一款刷题网站 &#x1f449; LeetCode刷题网站 目录 前言 一、二叉树的链式结构 二…

10 种创新的智慧废弃物管理技术

美国人每年产生约 2.5 亿吨垃圾&#xff0c;其中只有 34% 被回收。尽管有环保意识&#xff0c;但其他几项统计资料&#xff0c;揭示了令人震惊的垃圾倾向。废弃物管理的复杂性以前从未如此极端&#xff0c;这就是为什么今天这个行业僱用了近 50 万人&#xff0c;他们承担着每天…

【序列比对】Needleman-Wunsch(全局)和Smith-Waterman(局部)算法py实现(多条回溯路径,三叉树思路,超详细注释)

Needleman-Wunsch和Smith-Waterman算法py实现&#xff08;多条回溯路径&#xff09; 话不多说&#xff0c;直接上结果图&#xff0c;多条回溯路径。 原理 代码详解&#xff08;以NW为例&#xff09; 导入包以及参数设置 import numpy as npsequence_1 "AACGTACTCAAG…

数据分析经典算法——红黑树

数据分析经典算法——红黑树红黑树的重要性红黑树的定义红黑树图解红黑树的重要性 红黑树的优势 红黑树能够以O(log2(N))的时间复杂度的时间复杂度进行搜索、插入、删除操作。 此外,任何不平衡都会在3次旋转之内解决。 这一点是AVL所不具备的。 而且实际应用中&#xff0c;很多…

JAVA concurrency -- AQS 源码详解

概述 AQS全称AbstractQueuedSynchronizer是 jdk 中一个非常重要的方法&#xff0c;这是一个 jdk 的同步器的实现&#xff0c;JUC 中的很多类例如ReentrantLock等的实现都依赖于 AQS。 CAS AQS 的同步实现方式依赖于 CAS&#xff0c;那么 CAS 究竟是什么呢&#xff1f; CAS全…

写了半个月近3万字,助你直接上手Flink,原来这就是流批一体的处理方式

Flink即刻出发1.1.Flink 数据流1.2.Flink 分层 API1.3.Flink流处理程序的一般流程1.4.搭建Flink工程1.4.1.创建Maven项目1.5.批处理的单词统计1.5.1.示例1.5.2.开发步骤1.5.3.参考代码1.6.流处理的单词统计1.6.1.示例1.6.2.开发步骤1.6.3. 参考代码&#xff1a;java语言实现1.6…

Vue学习

Vue学习(第一天) 1、Vue.js安装 1.创建vue项目 2.启动vue项目 3.vue的MVVM 2、vue学习-1 1.vue cli 1.什么是vue cli 2.vue cli使用前提-Node 3.vue cli使用前提-Webpack 4.vue cli的使用 5.认识vue cli3 6.目录结构 7.vue ui 项目管理工具 2.什么是路由 1.前端阶段 3.url和hi…

C++STL——string类与模拟实现

STL容器——string类什么是STLstring类字符串的标准什么是stringstring常用接口介绍string的初始化比较大小与赋值容量对象的修改访问及遍历操作string中的swap与C库中的swap的区别非成员函数string类的模拟实现深浅拷贝与现代写法什么是STL STL(standard template libaray-标…

WRFV3.8.1编译报错,无法显示exe文件

问题报错&#xff1a;在WRF中遇到了一个可能和ubuntu系统有关的报错&#xff0c;主要表现为random seed过小&#xff0c;找不到&#xff0c;无法进行compile&#xff0c;导致compile em_real后无法生成4个*.exe文件。第一个报错出现位置为&#xff1a;。附件为compile.log。 图…

【树莓派不吃灰】命令篇④ Linux 常用命令学习

目录1. 常用命令1.1 操作文件及目录1.2 系统常用命令1.3 压缩解压缩1.4 linux系统常用快捷键及符号命令2. Linux 命令大全❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11-18 ❤️❤️ 本篇更新记录 2022-11-18 ❤️&#x…

YOLO系列改进之四十四——融入适配GPU的轻量级 G-GhostNet

文章目录前言一、解决问题二、基本原理三、​添加方法总结前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章…

Adafruit_GFX matrix ws2812像素屏库使用教程AWTRIX2.0像素时钟

AWTRIX2.0像素时钟很炫酷但必须要与服务器配合使用。这个库可以做自己的点阵时钟离线版。想怎么玩就怎么玩不受服务器牵绊。 第一步&#xff1a;下载mixy库然后倒入&#xff0c;必须有以下库文件&#xff1a; Adafruit_GFX FastLED FastLED_NeoMatrix TomThumb #include <Li…

Seata 1.5.2 源码学习(Client端)

在上一篇中通过阅读Seata服务端的代码&#xff0c;我们了解到TC是如何处理来自客户端的请求的&#xff0c;今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的。要想搞清楚这一点&#xff0c;还得从GlobalTransactionScanner说起。 启动的时候&#xff0c;会调用Global…

【计算机毕业设计】新冠疫情隔离人员信息管理系统+vue源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 网络的广泛应用给生活带来了十分的便利。所以把基于小程序的社区疫情防控管理与现在网络相结合&#xff0c;利用ssm框架技术建设基于小程序的社区疫情防控系统&#xff0c;实现基于小程序的社区疫情防控的信息…

双线路捆绑

双线路捆绑是在服务器上接入两条上网线路并行使用 以达到提高链路上下行带宽&#xff08;即上传和下载速度&#xff09;的目的 默认情况下双线路捆绑采用负载均衡模式&#xff0c;并可更改为互为备份模式。 在负载均衡模式下&#xff0c;双线路的使用是基于会话的&#xff0…

已经有 MESI 协议,为什么还需要 volatile 关键字?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了 CPU 的缓存一致性问…

树莓派使用docker搭建owncloud私有云--外挂硬盘

一&#xff0e;安装docker 1. 一键脚本&#xff1a; sudo curl -sSL https://get.docker.com | sh2. 查看docker是否安装成功 docker -v出现版本号即为成功 二&#xff0e;每次开机自动挂载硬盘到树莓派 sudo nano /etc/fstab在最后一行加入挂载信息 /dev/sda1 /home/pi/…

[附源码]java毕业设计农村政务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…