学习汇编语言MASM笔记1

2023-10-27

关于源程序书写格式:(太基础的略去,只记录一些我还不熟悉的内容,参考https://wenku.baidu.com/view/7ca70e0ef342336c1eb91a37f111f18582d00c5d.html
其他网页的参考以挂上相关连接)

关于段定义关于段定义

  • 堆栈段、数据段、代码段是逻辑段 汇编、连接后生成物理段 逻辑段与物理段的关系取决于伪指令ASSUME
  • 一个源程序至少一个逻辑代码段和END伪指令
  • 完整段定义:完整段定义
  • 简化段定义1:
     简化段定义1
    在这里插入图片描述
  • 注意SEGMENT/ENDS成对出现
  • END:源程序文件结束
    格式:END [过程名|标号]
  • 程序开始伪指令:.STARTUP(只能在简化段定义格式中使用)
  • 结束程序:
    法1:用DOS 4CH功能调用
……
MOV AH,4CH
INT 21H
……

END

法2:RET方式

<程序名>PROC FAR
               PUSH DS
               SUB AX,AX
               PUSH AX
               ……
               RET
<程序名>ENDP
               ……
               END
  • 关于伪操作:
    它是汇编时进行的,不是计算机运行时执行的
    完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能在这里插入图片描述

  • 关于变量:

    • 变量的定义和预置:
      格式:<变量名> 伪操作符 <操作数>

    <变量名>由第一个字符不能是数字,前31个字符有效
    <操作数>课时数常数、表达式、字符串、?、DUP等
    伪操作符:DB, DW, DD, DF, DQ, DT
    在这里插入图片描述
    注:关于DUPEQU
    Dup用于把一个相同值赋值若干次。重复次数dup(数据项)
    具体比如:

s db 30 dup(0)

定义一个字节型变量,该变量占用30个字节,所有字节被初始化成0

equ是一个代码替换指令
比如:

s equ bx+si
movcx,[s]

那么上面两句代码相当于如下指令:
movcx,[bx+si]

  • 例子:
DATA_BYTE DB 10,4,10H,?
DATA_WORD DW 100,100H,-5,?

在这里插入图片描述

  • 变量的属性:
    段(segment):它属于哪个段,段基址是什么
    位移(offset):相对于段基址的位移是多少
    类型(type):表名数据项的长度,如字节,字,双字,4字等

  • 数据回送操作符的使用,如TYPE, LENGTH, SIZE, OFFSET, SEG
    在这里插入图片描述
    例子:在这里插入图片描述
    变量可以通过名字访问,要注意操作类型与定义时的类型一致:
    在这里插入图片描述

  • 关于寄存器

    1.立即寻址方式 MOV AH, 80H(直接给寄存器赋值)

  • 寄存器寻址方式(源或者目的有一个是寄存器)
    2.1) 源操作数是寄存器寻址方式
    如:ADD VARD, EAX  ADD VARW, AX   MOV VARB, BH等。
    其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
    2.2) 目的操作数是寄存器寻址方式
    如:ADD BH, 78h    ADD AX, 1234h   MOV EBX, 12345678H等。
    2.3) 源和目的操作数都是寄存器寻址方式
    如:MOV EAX, EBX   MOV AX, BX     MOV DH, BL等。

  • 直接寻址方式(地址值在括号里)
    MOV BX, [1234H] (默认使用DS)
    MOV ES:[1000H], AX

  • 寄存器间接寻址方式(寄存器在括号里)
    MOV BX,[DI]
    操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
    若有效地址用SI、DI和BX来指定,则其缺省的段寄存器为DS;
    若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。

  • 寄存器相对寻址方式(一个寄存器和一个立即数在括号里,并且还要计算)
    MOV BX, [SI+100H]

  • 基址加变址寻址方式(两个寄存器在括号里,并且还要计算)
    MOV BX, [BX+SI]

  • 相对基址加变址寻址方式(两个寄存器在括号里和一个立即数在括号里,并且还要计算)
    MOV AX, [BX+SI+200H]

  • mov ax,data:
    mov ax,data这句,如果是前面有assume ds:data的情况,是将地址值传给ax;
    若data是一个变量,如
    DATAS SEGMENT
    data dw 12H;
    DATAS ENDS
    中的data,则是把data中的数据给ax。

在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
例如:
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
需要注意的是:
(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV [SI],[2000H];这是错误的
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV IP,2000 H ;这是错误的
(3)CS和IP不能作为目的操作数。MOV CS,AX ;这是错误的
(4)MOV指令中立即数不能作目标操作数。MOV 2000H,[SI] ;这是错误的

MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。
但是注意
(1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器;
(2) MOV指令中绝对不允许在两个存储单元之间直接传送数据;
(3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据;
(4) MOV指令不会影响标志位

例:MOV AX,DATA_SEG
MOV DS,AX
注意:段寄存器(段地址)必须通过寄存器如AX寄存器进行立即数的初始化。

例: MOV AL,‘E’
把立即数(字符E的ASC码)送到AL寄存器。
例: MOV BX,OFFSET TABLE
将TABLE的偏移地址(而不是内容)送到BX寄存器中。其中OFFSET为属性操作符,表示的是将其后的符号地址的值(不是内容)作为操作数。
例 MOV AX,Y[BP][SI]
把地址为16d×(SS)十(BP)十(SI)十位移量Y的存储单元的内容送给AX寄存器

ROL AL,1就把最高位的 1 移到最后,使AL变成 0100 0001,同时移出的1送CF;
ROL AL,CL(CL=2),相当于2次 ROL AL,1,所以AL变成 1000 0010,最后移出的0送CF。

RCL AL,1则把AL的最高位1送给CF,使CF=1,AL其它位相应左移,成为 0100 000X,最后空下的X位被CF原来的值补齐;
同样,ROL AL,CL(CL=2),相当于2次 RCL AL,1,最后AL变成 1000 00X1,AL原第二位的0到了CF,CF原来的值补AL中的x。

  • JLE是什么意思
    这是条件转移指令,L是low(低的)E是equit(相等的),比如 cmp a ,b,后面再接JLE,如果a<=b的话,就跳转到别的命令上
CMP  AL,'9'        ;AL原来已经复制了
JLE  DISPLAY 
	   ADD   AL,07H          
DISPLAY:          
	  MOV  DL, AL
  • 关于宏定义(转自https://blog.csdn.net/qq_27035123/article/details/51456102 )
  • 简单说一下宏调用和子程序的区别:
    子程序在程序执行期间调用,只占用自身大小的一段空间。
    (必须到子程序的IP,好处是节省内存,效率高,但是因为要保存返回地址,转向地址,时间长,适合长代码,频繁调用的)
    宏调用,在汇编期间被展开,调用一次展开一次。
    宏汇编通常使用 macro 、endm这一对宏汇编伪指令来做到,格式如下:

宏名 macro [形参表]
宏定义体
endm

宏名在同一源程序中,保持唯一,宏可以带形式参数表;可选的形参表给出了宏定义中用到的形式参数(哑元,简称为形参),之间用逗号相隔。

宏定义中的注释如果是用;;分割的,则后边宏展开不再出现该注释。

宏调用的格式为:
伪指令格式:宏名[实参表]

本例中计算ah中的代码如下:

countah macro          ;使用
    push dx
    push cx

    mov ch, 8h
    mov cl, 0h 
    mov bh, 00000001 
 loopa: 
        mov dh, ah
        and dh, bh 
        shr dh, cl
        adc bl, dh
        rol bh, 1

        inc cl 
        dec ch
        jnz loopa   

    pop cx 
    pop dx
endm   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习汇编语言MASM笔记1 的相关文章

  • 蜂鸣器(汇编语言)

    蜂鸣器的发声主要需要搞懂两点问题 xff0c 第一 xff0c 如何使用单片机控制蜂鸣器发声 xff1b 第二 xff0c 选择合适的延时时间 如何使用单片机控制蜂鸣器的发声 xff1f 蜂鸣器分为有源和无源 xff0c 本实验采用无源蜂鸣
  • 汇编语言

    基础知识 1 1机器语言 计算机的机器指令是一列二进制数字 计算机将之为转变为一列高低电平 xff0c 以使计算机的电子器件受到驱动 xff0c 进行运算 1 2 汇编语言的产生 程序员 汇编指令 编译器 机器码 计算机 1 3 汇编语言的
  • 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04

    80X86中断系统 能够处理256个中断 用中断向量号0 xff5e 255区别 可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理 1 中断的分类 中断可以分为内部中断和外部中断 xff08 1 xff09 内部中断
  • 汇编:将表格写入到指定内存空间

    代码如下 assume cs code ds data es table ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985
  • 你知道 1 + 1 等于几吗?

    阅读本文需要 4 分钟 前言 当有人问你1 1等于几的时候 你会觉着这是对你的一种侮辱 这种弱智问题 居然拿来问我 听起来好像你说的没错 1 1是挺简单的 可是如果让你证明的话 可能你这一辈子都证明不出来 稍微知道一点的人 可能会联想到我国
  • 简单的debug32的基本语法介绍(基于dos环境)

    1 打开文件 debug 文件名 exe 2 r 简单的输入 r时就是查看当前各项寄存器的值 并由当前的地址 存储的指令等等 并且 我们可以用 r命令来对寄存器的值进行修改 如 r ax 3 a a指令可以让我们依次对内存单元直接写入汇编语
  • linux0.00 代码阅读笔记

    汇编语言的编写 编译 运行 调试 author hjjdebug date 参考代码地址 GitHub hjjdebug linux0 00 linux0 00 code compiled under ubuntu14 04 gcc 4 8
  • [从零学习汇编语言] - 转移指令进阶

    文章目录 前言 回顾 1 转移指令原理 2 已接触过的操作符 3 寄存器回顾 通用数据处理寄存器 指针寄存器 变址寄存器 段地址寄存器 其他寄存器 一 ret及retf 1 1 ret指令 1 2 retf指令 1 3 小练习 二 Call
  • CPU的标志寄存器

    1 ZF 零标志位 执行指令后结果为0 ZF 1 否则ZF 0 2 PF 奇偶标识位 它记录相关指令执行后 其结果的所有二进制位中1的个数是否为偶数 如果是偶数 PF 1 否则PF 1 3 SF 符号标识位 它记录相关指令执行后 其结果是否
  • 如何在MacOS上玩儿汇编?

    在Mac上写汇编还是相当方便的 本文通过写一个Helloworld程序来入门 首先 MacOS 自带nasm 只是版本有点老 编译不了64位程序 只要上官网下一个最新的 替换一下就行了 有一点需要注意的是mac上gcc编译 o文件的默认入口
  • Win8下用DOSBox编写汇编语言

    Win8下用DOSBox编写汇编语言 DOSBox 是一个 DOS模拟程序 可以很方便的移植到其他的平台 因此可以使用它在Win8系统中编写汇编语言 下面提供相关下载链接 DOSBox下载 http pan baidu com s 1qWw
  • 汇编语言中各种寄存器的总结

    汇编语言中各种寄存器的总结 1 通用寄存器 数据寄存器 AX BX CX DX 指针寄存器 SP BP 变址寄存器 SI DI 2 控制寄存器 IP FLAG 3 段寄存器 CS 代码段寄存器 基本概念解释 start作用 DS 数据段寄存
  • 1.下面的程序实现依次用内存的0:0~0:15单元中的内容改写程序中的数据,完成程序2.下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传递用栈来进行。栈空间设置在程序内。

    题目 下面的程序实现依次用内存的0 0 0 15单元中的内容改写程序中的数据 完成程序 assume cs codesg codesg segment dw 0123h 0456h 0789h 0abch 0defh 0fedh 0cbah
  • 汇编中16进制装换成为其他进制(2,8,10)

    16进制装换成为其他进制关键在于得到键盘输入 并将它保存在BINARY的这个变量里面 宏定义直接调用 例子中有 DISP etc 子程序的话要注意对主程序的信息的保护和恢复 我在这里使用的是在子程序里面去保护主程序的方式 你也可以在主程序调
  • 汇编语言——串操作指令

    若要处理连续内存单元中的一批数据 通常需要借助于循环 80x86CPU提供了一组串操作指令 可用来处理内存中的数据 字节 字 双字 串 这些指令包括MOVS LODS STOS SCAS CMPS 为了指出操作对象的长度 在助记符后加上B
  • VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/cpuid.c:376 bugNr=1036521

    这个问题的原因有几个 第一个原因就是网上说的要开启BIOS的Interl virtual technology 而我当时开启了之后依然报错 最后找到问题的原因在VMWare Workstation 右键我们的虚拟机 选择最下面的设置 然后注
  • Ubuntu/Linux下安装DosBox配置汇编环境

    Ubuntu Linux下安装DosBox配置汇编环境 微信关注公众号 夜寒信息 致力于为每一位用户免费提供更优质技术帮助与资源供给 感谢支持 一 首先我们去DosBox官网下载DosBox 0 73 或者直接启用终端命令行输入以下代码 s
  • 汇编语言 第3版 王爽 检测点答案及详细解析

    第一章 基础知识 检测点1 1 1 1个CPU的寻址能力为8KB 那么它的地址总线的宽度为 13位 2 1KB的存储器有 1024 个存储单元 存储单元的编号从 0 到 1023 3 1KB的存储器可以存储 8192 2 13 个bit 1
  • 汇编语言实现跑马灯 8051单片机

    通过一位 F 的16进制 转换为 2进制的 1111 然后移动一位 有三极管开关所改变 0的时候发光 1的时候变暗 所以一开始0FFH表示高8位为0 低8位为1111 1111 表示全暗 然后右移变为1111 1110亮第一个等 之后类推
  • 汇编实验(循环程序设计)(排序以及找非负数)

    这里的排序 用的是冒泡排序 首先 先是说一下找非负数的想法 负数 TEST 80H 之后不为0 我们可以用这个性质来做 1 FIND POSITIVE NUMBER LEA SI FIRST LEA DI SECOND MOV CX N L

随机推荐

  • 服务器设置虚拟ip,服务器设置虚拟ip

    服务器设置虚拟ip 内容精选 换一换 通过华为云创建的ECS服务器默认使用华为云提供的内网DNS进行解析 内网DNS不影响ECS服务器对公网域名的访问 同时 还可以不经Internet 直接通过内网DNS访问其他云上服务内部地址 如OBS
  • 删除文件夹以及文件夹内容

    date 2009 10 26 用途 删除文件夹 public static void delFolder String folderPath try File file new File folderPath if file exists
  • Vue入门todolist组件

    div div
  • java 注解值_java 注解默认值操作

    我就废话不多说了 大家还是直接看代码吧 package com zejian annotationdemo import java lang annotation ElementType import java lang annotatio
  • 【Peter Dayan】自然和人工强化学习的结合、以及未来的发展方向

    深度强化学习实验室 官网 http www neurondance com 论坛 http deeprl neurondance com 来源 AI科技评论 作者 Mr Bear 青暮 德国马克斯 普朗克生物控制论研究所所长Peter Da
  • 关于对doCreateBean方法下的的createBeanInstance方法的分析

    一 前言 最近在看Spring的相关源码 这次来分析一下createBeanInstance 方法 在getBean 的时候调用了doGetBean 而doGetBean 内最为核心的就是doCreateBean 方法 在doCreateB
  • java concurrent 探秘

    java concurrent 探秘 转 我们都知道 在JDK1 5之前 Java中要进行业务并发时 通常需要有程序员独立完成代码实现 当然也有一些开源的框架提供了这些功能 但是这些依然没有JDK自带的功能使用起来方便 而当针对高质量Jav
  • Python爬虫笔记——post请求、cookies及session

    一 post请求 post和get都可以带着参数请求 不过get请求的参数会在url上显示出来 但post请求的参数就不会直接显示 而是隐藏起来 像账号密码这种私密的信息 就应该用post的请求 如果用get请求的话 账号密码全部会显示在网
  • Python中的小工具和setWidget等相关概念解析

    Python中的小工具和setWidget等相关概念解析 在Python编程中 无论是桌面应用程序还是Web应用程序 我们都需要用到各种小工具来构建UI界面 其中 Qt是一种流行的GUI框架 提供了很多用于创建UI界面的小部件 widget
  • 每日一题 102二叉树的层序遍历

    题目 给你二叉树的根节点 root 返回其节点值的 层序遍历 即逐层地 从左到右访问所有节点 示例 1 输入 root 3 9 20 null null 15 7 输出 3 9 20 15 7 示例 2 输入 root 1 输出 1 示例
  • 4.3 C++成员模板参数、显示实例化、特化

    C 成员模板参数 关键字 typename 内嵌是指定义在类的定义中的 依赖是指依赖于一个模板参数O typedef类型名是指这里最终要指出的是个类型名 using给模板起别名 显示实例化和隐式实例化 模板的全特化与偏特化 因为编译器认为
  • python-parser.parse_args()解析参数

    import argparse 设置参数对象 简要设置为该程序要执行什么任务 parser argparse ArgumentParser mission name 调用 add argument 方法添加参数 parser add arg
  • 自举电路可以增加输入阻抗,你知道吗?

    原文来自微信公众号 工程师看海 以前写过一篇文章 介绍自举电路在BUCK电源的应用 驱动高边MOS https www dianyuan com eestar article 2127 html 反馈不错 今天再来介绍下自举电路增加输入阻抗
  • nodejs 下使用js封装console.log方法输出自定义的彩色字体,遇到Octal escape sequences are not allowed in template strings

    阳光明媚 在家敲javascript的代码 控制台里清一色的黑底白字 我console log出来的文字也是黑底白字淹没在茫茫字母海中 所以我想封装一下log方法 能自己定义字体还有背景的颜色 然后就出现了这个报错 Octal escape
  • OpenCV 图像旋转

    1 RotateArbitrarilyAngle Mat src Mat dst float angle 2 3 float radian float angle 180 0 CV PI 4 5 填充图像 6 int maxBorder i
  • SQL 题目(一)

    url http www cnblogs com finejob articles 974900 html 其他题目 url 为管理岗位业务培训信息 建立3个表 S S SN SD SA S SN SD SA 分别代表学号 学员姓名 所属单
  • 【轩说AI】无监督特征学习——主成分分析、稀疏编码、自编码器

    文章目录 无监督学习 无监督特征学习 主成分分析 稀疏编码 自编码器 主成分分析PCA 理解什么是PCA 有什么用处 稀疏编码 编码 交替优化 自编码器 Auto Encoder 稀疏自编码器 无监督学习 无监督特征学习 主成分分析 稀疏编
  • FortiGate下用户访问特定网址不通

    1 现状 如图 上网行为管理和防火墙控制用户的数据访问 到外网的出口链路有2条 联通的和电信的 其中联通的优先级较高 2 现象 用户访问www xxxxbbs com不通 3 分析 在上网行为管理上做源和目前地址排除 发现仍不能访问排除了上
  • ERP为什么在生产制造环节应用效果不理想?

    ERP在生产制造环节应用效果不理想的根本原因是ERP负责的是宏观管控 而生产制造环节应该使用MES来进行精细化管理 下面就详细讨论下 生产制造环节发生在工厂 工厂可以没有ERP 但如果要用系统 必定是MES系统 ERP是为企业服务的 MES
  • 学习汇编语言MASM笔记1

    关于源程序书写格式 太基础的略去 只记录一些我还不熟悉的内容 参考https wenku baidu com view 7ca70e0ef342336c1eb91a37f111f18582d00c5d html 其他网页的参考以挂上相关连接