汇编语言——王爽

使用debug执行汇编程序的步骤:

dir进入界面

编译:masm

链接:link

执行:debug 文件名

汇编程序格式

assume cs:code    cs是寄存器,code是标号;

code segment                //代码段开始

... ...

mov ax,4c00h

int 21h                        //上两行表示程序结束,唤起中断;

code ends                        //代码段结束

end                                //程序结束

汇编语言包括代码段,数据段,栈段三部分,后两个通过预先定义数据来实现;

如何区分不同的段完全根据指令;

[bx]和内存单元的描述

用[0]表示内存单元时,0表示单元的偏移地址,段地址在ds中,单元的长度(类型)可以有具体的指令中其他的操作对象指出(如寄存器);

这段话得到,会有专门的寄存器存储内存单元的长度,放置越界;即内存单元的长度由寄存器指出。

合法指令:mov ax 1合法指令;mov ds,1是非法指令;

数据寄存器和地址寄存器:

ax,bx,cx,dx是数据寄存器,向其中写入数据是合理的,而ds,cs,ip,ss,sp则不是,它们是地址寄存器,不能直接写入数据,只能通过数据寄存器送入数据。

Loop指令

loop指令的格式

loop 标号

操作步骤

1.(cx)=(cx)-1;

2.判断cx中的值,不为0则转至标号处执行,为0则向下执行;

cx的值表示循环次数;

提前结束循环命令

p指令可以一次执行完循环所有指令,g指令可以一直执行到具体指令处,g 偏移地址

Debug 和masm对指令的不同理解

Debug和masm对”mov ax,[0]“的理解不同,Debug将[idata]理解为一个内存单元,idata是偏移地址,masm编译器将“[idata]”解释为数据"idata";

在汇编源程序中编写如下程序。

assume cs:code
code segment
    mov ax,2000    
    mov ds,ax
    mov al,[0]
    mov bl,[1]
    mov cl,[2]
    mov dl,[3]

mov ax,4c00h
int 21h

code ends
end

执行后寄存器结果如下:

可以看到,[0]被理解为0,[1]被理解为1;

 因此,需要使用bx作为偏移地址,用[bx]代表偏移地址,很麻烦;可以采用ds:[0]的方式显示的指出地址:

mov ax,ds:[0]的含义就是将段地址为ds,偏移地址为0的内存出的数据送入ax中;

总结

从上面可以看出,如果要访问一个内存单元,需在指令中使用[...]来表示内存单元,如果在[]里用一个常量idata直接给出内存单元的偏移地址,就要在[]前现实的给出段地址所在的寄存器;如果[]里使用寄存器,则段地址默认在ds中,当然也可以显式的给出段地址所在的寄存器。(P112)

loop和[bx]联合使用

编写程序计算fff:0~ffff:b单元中数据的和;程序如下:

assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax
    mov bx,0
     mov dx,0
s:    mov al,ds:[bx]
    mov ah,0
    add dx,ax
    inc bx
    loop s

mov ax,4c00h
int 21h

code ends

end

 段前缀

可以显式的给出段地址所在的段寄存器,汇编语言中显式的指出内存单元段地址的:ds:,cs:,ss:,es:被称为段前缀

mov ax,ds:[bx],段地址在ax中

mov ax,cs:[bx],段地址在cs中

mov ax,es:[0],段地址在es中

一段安全的空间(P117)

不能随意写入

有些内存空间不能随意改写,如下面的代码在0:26处写入数据,结果引起死机。

mov ax,0

mov ds,ax

mov [26],ax

结果引发了 inc sp,系统死机;因此不能随意向内存中写入内容;

哪里有安全的空间

1.一般的PC机中,0:200~0:2ff这256个字节的内存空间是没有程序或系统使用的,是可以安全的写入数据的;

2.使用debug查看内存空间的内容,如果都是0,说明可以使用。

段前缀的使用(P120)

问题:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中

assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0

s:    mov dl,[bx]
    mov es:[bx],dl
    inc bx
    loop s

mov ax,4c00h
int 21h

code ends
end

 包含多个段的程序(123)

assume cs:code,ss:stack,ds:data

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 ax,20h
    mov sp,ax

    mov bx,0
    mov cx,8
    
s:    push cs:[bx]
    add bx,2
    loop s
    
    mov bx,0
    mov cx,8
s0:    pop cs:[bx]
    add bx,2
    loop s0
    
    mov ax,4c00h
    int 21h
    
code ends


end start

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

and和or指令

and:都为一才为1,否则为0;

or指令:都为0才为0,否则为1;

以字符形式给出的数据

在汇编程序中,使用'......'的方式知名数据以字符的形式给出,编译器将把他们转换为对应的ASCII码,

assume cs:code,ds:data
data segment
    db    'uniX'       ;定义了'uniX'的字符
    db    'foRK'
data ends

code segment

  start:  mov al,'a'
    mov bl,'b'
    
mov ax,4c00h
int 21h

code ends
end start

大小写转换(P140)

转换方法:加减20H,或者使用and,or指令

[bx+idata]

[bx+idata]表示一个内存单元,偏移地址为(bx)+idata

mov ax,[bx+200]:将一个内存单元的内容送入ax,偏移地址为bx的数值+200,段地址在ds中;

该指令的格式:

mov ax,[bx+200]

mov ax,200[bx]

mov ax,[bx].200

三种格式都可以。

SI和DI

SI,DI是8086中和bx功能相近的寄存器,但si,di不能被分解为两个8位寄存器来使用。

[bx+si+idata],[bx+di+idata]:

格式如下:

mov ax,[bx+200+si]

mov ax,[bx].200[si]

mov ax,[bx][si].200

mov ax,200[bx][si]

数据处理的两个基本问题-寻址方式总结

1.数据在什么地方

2.数据有多长

使用reg描述一个寄存器,使用sreg描述一个段寄存器

reg:ax,bx,cx,dx,al,ah,bl,bh,cl,ch,dl,dh,sp,si,di,bp

sreg:ds,cs,ss,es

只有bx,si,di,bp可以用于内存寻址;这四个寄存器可以单个出现,当组合出现时只能以以下四种组合出现:bx和si,bx和di,bp和si,bp和di;即有相同字母的寄存器不能同时出现;

综上,寻址方式如下:

指令处理的数据在哪里

(1)立即数

mov ax,1

(2)寄存器

mov ax,bx

(3)段地址和偏移地址

mov ax,ds:[1]

指令要处理的数据有多长

(1)通过寄存器名知名要处理的数据尺寸

mov ax,1表明数据为字

mov al,1表明数据为字节

(2)没有寄存器存在的情况下,用操作符 X ptr 指明内存单元的长度,X在汇编指令中可以为word或byte.

mov word ptr ds:[0],1                向ds:[0]处写入1(单位为字);

mov byte ptr ds:[0],1                数据长度为字节;

(3)其他方法

有些指令默认了访问的是字单元还是字节单元;如push,pop都为字操作;

寻址方式综合应用:修改结构体数据

问题:

内存中一处记录某公司的信息,要求将排名修改为40,收入修改为70,产品修改为VAX;

原信息:

代码:

assume cs:code,ds:data

data segment
    db 'DEC','Ken Oslen'
    dw 137,40
    db 'PDP'

data ends


code segment

start:    mov ax,data
    mov ds,ax
    mov bx,0
    mov word ptr [bx].0ch,38
    mov word ptr [bx].0eh,70
    
mov si,0
    mov byte ptr [bx].10h[si],'V'
inc si
    mov byte ptr [bx].10h[si],'A'
inc si
    mov byte ptr [bx].10h[si],'X'
    的
mov ax,4c00h
int 21h
code ends

end start

div,dd,dup指令

div除法指令

除数:8位或16位,存储在reg或内存单元中;

被除数:默认在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放,如果除数为16位,被除数为32位,低位存放在AX中,高位存放在DX中,

结果:如果除数为8位,AL存储除法操作的商,AH存储除法操作的余数;

           如果除数位16位,AX存储除法操作的商,DX存储除法操作的余数;

格式:        div reg

                  div 内存单元

具体:        div  byte ptr ds:[0]        除数是8位

                   div word ptr ds:[0]        除数是16位

伪指令dd

dd可以用来定义双字数据,即占据2个字长度的数据;

dup

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

之前:                                db 0,0,0                 db 1,2,3                                 

现在(使用dup):          db 3 dup (0)                db 1 dup(1,2,3)                

db 3 dup(0,1,2) :db 0,1,2,0,1,2,0,1,2

dup格式如下:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据集笔记:华盛顿共享单车OD数据

2010~2022 共享单车OD数据 数据地址:Index of bucket "capitalbikeshare-data"

Linux下C语言操作网卡的几个代码实例?特别实用

前面写了一篇关于网络相关的文章:如何获取当前可用网口。 《简简单单教你如何用C语言列举当前所有网口!》 那么如何使用C语言直接操作网口? 比如读写IP地址、读写MAC地址等。 一、原理 主要通过系统用socket()、ioctl()、实现 int sock…

《三国志》游戏的MySQL数据设计与管理

在任何成功的游戏背后,都有一个精心设计和管理的数据系统。这不仅决定了游戏的运行效率,还直接影响到玩家的游戏体验。 本文将深入探讨著名游戏《三国志》中的数据设计和管理。本文将讲解游戏中核心的数据元素、数据管理方法,以及开发团队在数据方面所做的工作。 文章目录 …

Java版本企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…

深入理解JavaScript中的事件冒泡与事件捕获

在JavaScript中,事件是交互式网页开发中的关键概念之一。了解事件冒泡和事件捕获是成为一名优秀的前端开发者所必需的技能之一。本文将深入探讨这两个概念,解释它们是如何工作的,以及如何在实际应用中使用它们来处理事件。 一.什么是事件冒泡…

Android Shape设置背景

设置背景时&#xff0c;经常这样 android:background“drawable/xxx” 。如果是纯色图片&#xff0c;可以考虑用 shape 替代。 shape 相比图片&#xff0c;减少资源占用&#xff0c;缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…

智慧安防视频监控技术+AI智能分析算法助力美好乡村建设

上期我们聊到AI智能视频监控技术如何助力美好乡村建设&#xff1f;的相关方案&#xff0c;收到了很多粉丝的讨论与关注&#xff0c;视频监控只是乡村建设极其基础的一环&#xff0c;基于视频监控平台的AI智能算法&#xff0c;将人工智能融合到安防监控之中&#xff0c;才能让乡…

【Linux】详解线程第三篇——线程同步和生产消费者模型

线程同步和生消模型 前言正式开始再次用黄牛抢票来讲解线程同步的思想通过条件变量来实现线程同步条件变量接口介绍初始化和销毁pthread_cond_waitsignal和broadcast 生产消费者模型三种关系用基本工程师思维再次理解基于生产消费者模型的阻塞队列版本一版本二多生多消 利用RAI…

第79步 时间序列建模实战:支持向量机回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍支持向量机&#xff08;SVM&#xff09;回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemor…

【图像处理】SIFT角点特征提取原理

一、说明 提起在OpenCV中的特征点提取&#xff0c;可以列出Harris&#xff0c;可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取&#xff0c;只是管中窥豹&#xff0c;而更多的特征点算法有&#xff1a; Harris & Stephens / Shi–Tomasi 角点…

C进阶--数据的存储

⚙ 1. 数据类型介绍 1.1基本内置类型 ⭕ 整形&#xff1a; char(char又叫短整型)unsigned charsigned charshortunsigned short[int]signed short [int]intunsigned intsigned intlongunsigned long [int]signed long [int] ⭕ 浮点数&#xff1a; float&#xff08;单精度浮…

Idea引入thymeleaf失败解决方法

报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.Fri Sep 29 09:42:00 CST 2023 There was an unexpected error (typeNot Found, status404). 原因&#xff1a;html没有使用thymeleaf 首先要引入…

java mongodb 并表 group 查询 Bson

对mongodb的使用中&#xff0c;需要将发生额表occr期初表open表&#xff0c;进行union的并表操作后&#xff0c;再进行group&#xff0c;sum&#xff0c;排序&#xff0c;分页操作。 查询了一番后&#xff0c;mongodb4.4版本后&#xff0c;新增了一个管道符&#xff0c;$union…

使用Vue、ElementUI实现登录注册,配置axios全局设置,解决CORS跨域问题

目录 引言 什么是ElementUI&#xff1f; 步骤1&#xff1a;创建Vue组件用于用户登录和注册 1. 基于SPA项目完成登录注册 在SPA项目中添加elementui依赖 在main.js中添加elementui模块 创建用户登录注册组件 配置路由 修改项目端口并启动项目 静态页面展示图 步骤2&#x…

【文献】TOF标定 Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair

文章目录 Article info.Introduction处理TOF误差Take home messagesResourcesIDEAS Article info. Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 37, NO. 7, JULY 2015 Intr…

FreeRTOS入门教程(空闲任务和钩子函数及任务调度算法)

文章目录 前言一、空闲任务概念二、钩子函数概念三、任务调度算法四、任务调度算法实验1.实验代码2.是否抢占3.时间片是否轮转4.空闲任务让步 总结 前言 本篇文章将带大家学习一下什么是空闲任务以及钩子函数&#xff0c;以及学习FreeRTOS中的任务调度算法&#xff0c;了解在F…

京东大型API网关实践之路

概述 1、背景 京东作为电商平台&#xff0c;近几年用户、业务持续增长&#xff0c;访问量持续上升&#xff0c;随着这些业务的发展&#xff0c;API网关应运而生。 API网关&#xff0c;就是为了解放客户端与服务端而存在的。对于客户端&#xff0c;使开放给客户端的接口标准统…

docker系列(9) - docker-compose

文章目录 9. compose编排9.1 介绍9.2 安装9.3 compose常用命令9.4 实战Springboot部署9.4.1 准备组件配置文件9.4.1.1 redis的配置文件9.4.1.2 MySQL的配置文件9.4.1.3 SpringBoot打包文件 9.4.2 准备docker-compose.yml9.4.3 启动服务9.4.4 测试验证 9.5 实战ElasticsearchKib…

华为智能高校出口安全解决方案(2)

本文承接&#xff1a; https://qiuhualin.blog.csdn.net/article/details/131475315?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的基础网络安全&业务部署与优化的部署流程。 华为智能高校出口安全解决方案&#xff08;2&#xff09; 课程地址基础网络…

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。 这是刚启动Autodesk 2024产品就弹出的弹窗&#xff0c;重启之后启动还是有这个 一直阻止安装程序运行 出现问题的原因是安装包存在问题 使用正确的安装包即可解决这个问题 需要的朋友查看图片或者评伦取…