章节目录

  1. 简单程序
  2. 使用段
  3. 简单字符串处理程序
  4. 使用 bx, si, di, bp 寄存器寻址
  5. 寻址方法
  6. 指明数据长度
  7. div指令

作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!

本文中所有程序均在DOSBox下使用MASM, LINK编译运行

简单程序

  • segment…ends: 伪指令, 用来定义一个段(比如,代码段,数据段,堆栈段), segment 标识一个段的开始, ends 标识一个段的结束.
  • 语法:
    SegmentName segment
    ..
    SegmentName ends

  • assume: 伪指令, 它假设某一段寄存器和程序中的某一个用 segment..ends 定义的段相关联.

  • mov ax, 4c00h
    int 21h

    称为程序返回,它的作用是将 CPU 的控制权交还给使他得以运行的程序.
  • 使用段

    使用 assume 将我们定义的数据段,堆栈段,代码段和对应的段寄存器关联起来.

    cs 寄存器对应代码段
    ds 寄存器对应数据段
    ss 寄存器对应堆栈段

    值得注意, 我们在访问数据段或者堆栈段的时候,总是将段基址先保存在 ax 中,然后由 ax 保存到 ds 或者 ss. 为什么不直接将段基址保存到 ds 或者 ss 中? 答案是该操作非法.

    简单字符串处理程序

    在这里, 我们使用 bx + offset 的语法访问数据段中的字符串. 相应的字符的地址计算方法为 addr=ds∗16+bx+offsetaddr=ds∗16+bx+offsetaddr = ds * 16 + bx + offset.

    这里 offset 一般为常量. 如果不是常量, 我们可以使用 [bx+di+offset] 来完成. 相应的字符的地址计算方法为 addr=ds∗16+bx+di+offsetaddr=ds∗16+bx+di+offsetaddr = ds * 16 + bx + di + offset.
    对于栈的访问可以使用 [bx+si+offset] 的方式访问. 相应的字符的地址计算方法为 addr=ds∗16+bx+si+offsetaddr=ds∗16+bx+si+offsetaddr = ds * 16 + bx + si + offset.

    使用 bx, si, di, bp 寄存器寻址

  • 只有这四个寄存器可以用在 ‘[…]’ 中来进行内存单元寻址
  • 比如:
    mov ax, [bx]
    mov ax, [bx+si]
    mov ax, [bx+di]
    可以使用 bp 替换 bx.

    //以下用法是错误的
    mov ax, [ax]
    mov ax, [cx]
    mov ax, [dx]
    mov ax, [ds]

  • 这四个寄存次可以单个出现在 ‘[…]’ 中或者以组合出现.
  • 组合形式只能是以下四种:

    mov ax, [bx + si + offset]
    mov ax, [bx + di + offset]
    mov ax, [bp + si + offset]
    mov ax, [bp + si + offset]
    当然 offset 可以为零.

    //以下用法是错误的
    move ax, [di + si]
    move ax, [bx + bp]

  • 只要在 ‘[…]’ 中使用 bp 寄存器, 而指令中没有显式的给出段地址, 段地址默认在 ss 中.
  • 寻址方法

  • 直接寻址
  • 如: mov ax, [0] // 段基址在 ds 中

  • 寄存器间接寻址
  • 如:
    mov ax, [bx] // 段基址在 ds 中. bx 指明偏移
    mov ax, [si] // 段基址在 ds 中. si 指明偏移
    mov ax, [di] // 段基址在 ds 中. di 指明偏移
    mov ax, [bp] // 段基址在 ss 中. bp 指明偏移

  • 寄存器相对寻址
  • 如:
    mov ax, [bx+offset] // 段基址在 ds 中. bx+offset 指明偏移
    mov ax, [si+offset] // 段基址在 ds 中. si+offset 指明偏移
    mov ax, [di+offset] // 段基址在 ds 中. di+offset 指明偏移
    mov ax, [bp+offset] // 段基址在 ss 中. bp+offset 指明偏移

  • 基址变址寻址
  • 如:
    mov ax, [bx+si] // 段基址在 ds 中. bx+si 指明偏移
    mov ax, [bx+di] // 段基址在 ds 中. bx+di 指明偏移
    mov ax, [bp+si] // 段基址在 ss 中. bp+si 指明偏移
    mov ax, [bp+di] // 段基址在 ss 中. bp+di 指明偏移

  • 相对基址变址寻址
  • 如:
    mov ax, [bx+si+offset] // 段基址在 ds 中. bx+si+offset 指明偏移
    mov ax, [bx+di+offset] // 段基址在 ds 中. bx+di+offset 指明偏移
    mov ax, [bp+si+offset] // 段基址在 ss 中. bp+si+offset 指明偏移
    mov ax, [bp+di+offset] // 段基址在 ss 中. bp+di+offset 指明偏移

    指明数据长度

  • 通过寄存器名指明要处理的数据的尺寸
  • // 使用字长度 (ax: 16bit)
    mov ax, 1
    mov ds:[0], ax

    // 使用字节长度 (al: 8bit)
    mov al, 1
    mov ds:[0], al

  • 在没有寄存器名存在的情况下, 使用操作符 Type ptr 指明内存单元长度. Type 可以使 word 或者 byte.
  • // 使用字长度 (ax: 16bit)
    mov word ptr ds:[0], 1
    add word ptr [bx], 1

    // 使用字节长度 (al: 8bit)
    mov byte ptr ds:[0], 1
    add byte ptr [bx], 1

  • 有些指令有默认的访问数据长度. 比如 push 就只能进行字操作
  • div指令

    注意问题:

  • 除数: 有 8 位和 16 位两种, 在一个 reg 或者内存单元中
  • 被除数: 默认放在 AX 或者 DX 和 AX 中, 如果除数为 8 位, 被除数则为 16 位, 默认在 AX 中; 如果除数为 16 位, 被除数则为 32 位, 在 DX 和 AX 中存放, DX 存放高 16 位, AX 存放低 16 位.
  • 结果: 如果除数为 8 位, 则 AL 存放除法操作的商, AH 存放余数; 如果除数为 16 位, 则 AX 存放除法操作的商, DX 存放余数;
  • 欢迎交流任何想法.

    End…

汇编语言笔记(一):基础相关推荐

  1. 汇编语言二进制转十进制_汇编语言笔记(一)——基础知识

    汇编语言基础知识 汇编语言组成 汇编指令:就是机器指令的助记符 伪指令 其他符号 计算机中数的表示 2^10=1K 2^20=1M 2^30=1G 2^40=1T 进制运算 二进制运算:1+1=0(向 ...

  2. 汇编语言笔记——接口技术与编程

    文章目录 传送门 储存系统与技术 材料 高速储存器缓冲储存器(Cache) 材料,局部性,访问方式 Cache全相联映射 Cache交换与一致性 单核CPU一致性处理 多核CPU的MESI协议 主储存 ...

  3. 汇编语言笔记(待更新大作业)

    文章目录 前言 计算机系统基础 概述 微处理器/中央处理器(CPU) 概述 性能指标与总线 前端总线(Front Side Bus) 带宽 数据总线DB/地址总线AB/控制总线CB CPU软件特性与指 ...

  4. 初学Oracle的笔记(2)——基础内容(实时更新中..)

    续 初学Oracle的笔记(1)--基础内容(实时更新中..) 1.oracle中创建一张表,写法与sql server中的一样. SQL> create table Course 2 ( cn ...

  5. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  6. 学习MSCKF笔记——四元数基础

    学习MSCKF笔记--四元数基础 学习MSCKF笔记--四元数基础 1. 四元数基本性质 1.1 加法 1.2 乘法 1.3 共轭 1.4 模 1.5 逆 1.6 单位四元数 1.7 指数 1.8 对 ...

  7. 笔记-项目管理基础知识-复习要点

    1. 项目的特点 临时性(一次性).独特性.渐进明确性 2. 项目目标包括成果性目标和约束性目标 ●笔记-项目管理基础知识-项目目标 3. 项目目标的特点 多目标性.有限性.层次性 4. ▲项目管理5 ...

  8. 数字图像处理与Python实现笔记之基础知识

    数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...

  9. Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)

    Python学习笔记_1_基础_2:数据运算.bytes数据类型..pyc文件(什么鬼) 一.数据运算 Python数据运算感觉和C++,Java没有太大的差异,百度一大堆,这里就不想写了.比较有意思 ...

最新文章

  1. jsp mysql 图片路径,请教JSP中怎么向MySql中存入和取出图片
  2. Oracle 把过程与函数说透
  3. 创建基于Web的实时系统
  4. php 内容编码错误,PHP输出缓冲,ob_gzhandler引起的内容编码错误?
  5. 如何写一个批量下载PDF文件的程序hp48
  6. 转载 关于git的常用命令总结
  7. 可用和平精英画质助手iApp源码+全开源
  8. WTL入门(五) 自定义控件
  9. cim系统 是什么_CIM和IBM i:它是什么以及它如何工作
  10. 磁共振线圈分类_MRI技师必须知道的磁共振软硬件知识
  11. SSM_JSON格式增删改查
  12. nginx 会话保持
  13. 【JAVA】集合框架及复杂度
  14. 跟着官方文档一步一步搭建基于gozero的微服务
  15. Peewee fn 用法
  16. html中一些界面设计
  17. 关于构建umi+dva+ant react项目 附源码
  18. php fileinfo 作用,PHP Fileinfo函数 详解
  19. STM32学习心得二十六:DAC数模转换实验
  20. signal,blinker:信号(看我脸色行事)

热门文章

  1. 基于小样本学习的图像分类技术综述
  2. 3 操作系统第二章 进程管理 进程定义、特征、组织、状态与转换
  3. Exalogic硬件架构
  4. PHP正则匹配到2个字符串之间的内容,匹配HTML便签内容
  5. css —— 图片环绕+首行缩进
  6. javascript excel
  7. Java魔法堂:初探MessageFormat.format和ChoiceFormat
  8. postgresql数据类型转换
  9. 订单拣选作业模式总结
  10. linux非权限安装bioperl,Bioperl的简单安装