汇编内存寻址

devtools/2024/10/9 2:31:33/

处理字符问题

汇编程序中,用单引号(‘’)的方式指明数据是以字符的形式给出,编译器将把字符转换为相对应的ASCLL码。

大写字母ASCLL值 + 20H 转换为小写字母 (或运算or) 0010 0000

小写字母ASCLL值 - 20H 转换为大写字母 (与运算and) 1101 1111

示例:

大小写转换

assume cs:codesg, ds:datasg
datasg segmentdb 'BaSiC'db 'iNfOrMaTiOn'
dataseg endscodesg segment
start:mov ax, datasgmov ds,axmov bx,0mov cx,5s:mov al,[bx]and al,11011111bmov [bx],alinc bxloop smov bx,5mov cx,11s0:mov al,[bx]or al,00100000bmov [bx],alinc bxloop s0mov ax,4c00hint 21h  
codesg ends
end start; debug查看原始数据
; d 数据段地址:0
; g 
; d 数据段地址:0

[bx+idata]的含义

[bx+idata]表示一个内存单元,偏移地址为(bx)+idata(bx中的数值加上idata)。

mov ax,[bx+200]的含义

  • 将一个内存单元的内容送入ax
  • 该内存单元的长度为2字节(字单元)
  • 内存单元的段地址在ds中,偏移地址为200加上bx中的数值
  • 数学化的描述为:(ax) = ((ds) *16 + 200 + (bx))

其它写法如下:

mov ax,[200 + bx]
mov ax,200[bx]
mov ax,[bx].200

SI和DI寄存器

  • 通用寄存器: AX,BX,BX,DX
  • 变址寄存器: SI,DI
  • 指针寄存器: SP,BP
  • 指令指针寄存器: IP
  • 段寄存器: CS,SS,DS,ES
  • 标志寄存器: PAW

其中SI和DI执行与地址有关的操作。

SI: source index,源变址寄存器

DI: destination index,目标变址寄存器

示例如下:

mov bx,0
mov ax,[bx]		; 方式一mov si,0
mov ax,[si]		; 方式二mov di,0
mov ax,[di]		; 方式三
mov bx,0
mov ax,[bx+123]		; 方式一mov si,0
mov ax,[si+123]		; 方式二mov di,0
mov ax,[di+123]		; 方式三
应用SI,DI寄存器

采用寄存器SI和DI实现将字符串’welcome to masm!’ 复制到之后的内存区中。源数据起始地址:datasg:0,目标数据起始地址:datasg:16

  • 用ds:si指向需要复制的原始字符串
  • 用ds:di指向目的空间
assume cs:codesg, ds:datasg
datasg segmentdb 'welcome to masm!'db '.................'
datasg endscodesg segment
start: 	mov ax,datasgmov ds,axmov si,0mov di,16mov cx,8s:mov ax,[si]mov [di],axadd si,2add di,2loop smov ax,4c00hint 21h
codesg ends
end start

二维数组循环的处理,将每个单词改为大写字母。

assume cs:codesg,ds:datasg
datasg segmentdb 'ibm              'db 'dec              'db 'dos              'db 'vax              '
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov bx,0mov cx,4s0:mov dx,cx		; 将外层循环的cx值保存在dxmov si,0mov cx,3		; cx设置为内存循环的次数s:  mov al,[bx+si]and al,11011111bmov [bx+si], alinc siloop sadd bx,16mov cx,dx		; 用dx存放的外层循环计数值恢复cxloop s0			; (cx) = (cx) - 1针对外层循环
codesg ends
end start

内存寻址方式

形式名称特点意义示例
[idata]直接寻址用一个常量/立即数表示地址用于直接定位一个内存单元mov ax,[200]
[bx]寄存器间接寻址用变量表示内存地址,用于间接定位一个内存单元mov bx,0
mov ax,[bx]
[bx + data]寄存器相对寻址用变量和常量表示地址,可用于结构体,数组,二维数组在一个起始地址的基础上用变量间接定位一个内存单元mov bx,4
mov ax,[bx+200]
[bx + si]基地址变址寻址用两个变量表示地址,可用于二维数组mov ax,[bx+si]
[bx+si+idata]相对基址变址寻址用两个变量和一个常量表示地址,可用于二维数组mov ax,[bx+si+200]

声明数据大小

在没有寄存器参与的内存单元访问指令中,用word ptr(2字节)或byte ptr(1字节)显示地指明所要访问的内存单元长度,否则,cpu无法得知所要访问的单元是字单元,还是字节单元。

mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2

div指令

除法指令。

  • 被除数: 默认放在ax或dx和ax中
  • 除数: 8位或16位,在寄存器或内存单元中
被除数AXDX和AX
除数8位内存或寄存器16位内存或寄存器
ALAX
余数AHDX

示例如下:

div blaxblalah
div bx(dx)*10000H+(ax)bxaxdx

在默认的寄存器中设置好被除数,且默认寄存器不做其它用处。

dup指令的功能和用法

dup和db,dw,dd等数据定义伪指令配合使用,用来进行数据的重复。

指令功能结果
db 3 dup(0)定义三个字节,值都是0db 0,0,0
db 3 dup(0,1,2)定义了九个字节,由1,2,3重复三次组成db 0,1,2,0,1,2,0,1,2
db 3 dup(‘abc’,‘ABC’)定义了18个字节,构成了abcABCabcABCabcABCdb ‘abcABCabcABCabcABC’

使用格式为:

; db 重复的次数 dup (重复的字节型数据)
; dw 重复的次数 dup (重复的字节型数据)
; dd 重复的次数 dup (重复的字节型数据)

http://www.ppmy.cn/devtools/122398.html

相关文章

【解决】Mac 上 M系列芯片用 Vmware Fusion安装 win11 遇到的主要的问题汇总

此文很短,没闲话,干活满满 Mac 版本最干净版本的 win11 免费下载链接 :链接:https://pan.quark.cn/s/4e8e8bb93564 本文实验电脑为:Macbook Air M3 第一个问题:如何解决安装Windows11时出现“这台电脑无…

Spring源码学习(拓展篇):SpringMVC中的异常处理

目录 前言SimpleMappingExceptionResolver通过接口 HandlerExceptionResolver 实现通过 ExpceptionHander ControllerAdvice 注解实现(推荐) 前言 SpringMVC的异常处理主要有以下三种方式: 使用SpringMVC自带的异常处理类:Simpl…

滚雪球学Oracle[2.4讲]:创建Oracle数据库实例

全文目录: 前言一、使用DBCA进行复杂环境下的实例创建1.1 使用DBCA的步骤案例演示:DBCA创建实例 1.2 优点与适用场景 二、手动创建数据库实例的步骤与脚本2.1 手动创建数据库实例的步骤案例演示:手动创建Oracle数据库实例 2.2 手动创建的优点…

3DGS中Densification梯度累计策略的改进——绝对梯度策略(Gaussian Opacity Fields)

在学习 StreetGS 代码中发现了其中的 Densification 策略与原 3DGS 不太一样,其是使用的 Gaussian Opacity Fields 中的一个的策略 我们先来回忆一下 3DGS 中一个比较重要 contribution:自适应密度控制 1 自适应密度控制 其具体步骤如下: …

CUDA cooperative_groups grid_group测试

CUDA cooperative_groups grid_group测试 一.测试描述及小结1.任务描述2.输出3.小结 二.复现步骤三.grid_group.sync 代码对照1.CUDA C2.PTX3.SASS CUDA Cooperative Groups是CUDA编程模型中引入的一组高级特性,提供了更灵活的线程组织和同步机制 通过Cooperative G…

C 语言入门指南:致大一新生

亲爱的大一新生们: 当你踏入大学的校门,开启全新的学习之旅时,C 语言或许会成为你在计算机世界中探索的重要起点。C 语言作为一种广泛应用且基础的编程语言,掌握它将为你打开编程世界的大门。 一、认识 C 语言 C 语言是一种结构化…

一个简单的SQL面试题

最近面试遇到一个SQL题,复述如下: SQL面试题 现在有两张表,结构如下: 学生表(student) 学号sid姓名name1张三2李四3王五 成绩表(score) 序号id学号sid科目subject分数score11语…

【优选算法】(第十一篇)

目录 ⼭峰数组的峰顶(easy) 题目解析 讲解算法原理 编写代码 寻找峰值(medium) 题目解析 讲解算法原理 编写代码 ⼭峰数组的峰顶(easy) 题目解析 1.题目链接:. - 力扣(Leet…