汇编语言笔记(一):基础
章节目录
- 简单程序
- 使用段
- 简单字符串处理程序
- 使用 bx, si, di, bp 寄存器寻址
- 寻址方法
- 指明数据长度
- 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…
汇编语言笔记(一):基础相关推荐
- 汇编语言二进制转十进制_汇编语言笔记(一)——基础知识
汇编语言基础知识 汇编语言组成 汇编指令:就是机器指令的助记符 伪指令 其他符号 计算机中数的表示 2^10=1K 2^20=1M 2^30=1G 2^40=1T 进制运算 二进制运算:1+1=0(向 ...
- 汇编语言笔记——接口技术与编程
文章目录 传送门 储存系统与技术 材料 高速储存器缓冲储存器(Cache) 材料,局部性,访问方式 Cache全相联映射 Cache交换与一致性 单核CPU一致性处理 多核CPU的MESI协议 主储存 ...
- 汇编语言笔记(待更新大作业)
文章目录 前言 计算机系统基础 概述 微处理器/中央处理器(CPU) 概述 性能指标与总线 前端总线(Front Side Bus) 带宽 数据总线DB/地址总线AB/控制总线CB CPU软件特性与指 ...
- 初学Oracle的笔记(2)——基础内容(实时更新中..)
续 初学Oracle的笔记(1)--基础内容(实时更新中..) 1.oracle中创建一张表,写法与sql server中的一样. SQL> create table Course 2 ( cn ...
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
- 学习MSCKF笔记——四元数基础
学习MSCKF笔记--四元数基础 学习MSCKF笔记--四元数基础 1. 四元数基本性质 1.1 加法 1.2 乘法 1.3 共轭 1.4 模 1.5 逆 1.6 单位四元数 1.7 指数 1.8 对 ...
- 笔记-项目管理基础知识-复习要点
1. 项目的特点 临时性(一次性).独特性.渐进明确性 2. 项目目标包括成果性目标和约束性目标 ●笔记-项目管理基础知识-项目目标 3. 项目目标的特点 多目标性.有限性.层次性 4. ▲项目管理5 ...
- 数字图像处理与Python实现笔记之基础知识
数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...
- Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)
Python学习笔记_1_基础_2:数据运算.bytes数据类型..pyc文件(什么鬼) 一.数据运算 Python数据运算感觉和C++,Java没有太大的差异,百度一大堆,这里就不想写了.比较有意思 ...
最新文章
- jsp mysql 图片路径,请教JSP中怎么向MySql中存入和取出图片
- Oracle 把过程与函数说透
- 创建基于Web的实时系统
- php 内容编码错误,PHP输出缓冲,ob_gzhandler引起的内容编码错误?
- 如何写一个批量下载PDF文件的程序hp48
- 转载 关于git的常用命令总结
- 可用和平精英画质助手iApp源码+全开源
- WTL入门(五) 自定义控件
- cim系统 是什么_CIM和IBM i:它是什么以及它如何工作
- 磁共振线圈分类_MRI技师必须知道的磁共振软硬件知识
- SSM_JSON格式增删改查
- nginx 会话保持
- 【JAVA】集合框架及复杂度
- 跟着官方文档一步一步搭建基于gozero的微服务
- Peewee fn 用法
- html中一些界面设计
- 关于构建umi+dva+ant react项目 附源码
- php fileinfo 作用,PHP Fileinfo函数 详解
- STM32学习心得二十六:DAC数模转换实验
- signal,blinker:信号(看我脸色行事)