概述
前言
学习教材:《汇编语言(第4版)》王爽著
此笔记是书中内容+自我总结,方便查阅和复习
请支持原著
约定reg和sreg符号
reg(Register)表示一般寄存器,sreg(Segment Register)表示段寄存器
符号 | 描述 |
---|---|
reg | ax、bx、cx、dx(以及高低两部分)、sp、bp、si、di |
sreg | ds、ss、cs、es |
数据处理的两个基本问题
- 待处理数据的位置
- 待处理数据的长度
CPU在数据处理的过程只关在意以上两个问题,而不在意数据具体值是多少
文章目录
- 前言
- 约定reg和sreg符号
- 数据处理的两个基本问题
- 一、bx、bp和si、di
- 二、表达一个数据的位置
- Ⅰ、立即数——idata
- Ⅱ、寄存器——reg
- Ⅲ、段地址和偏移地址——SA:EA
- immediate operand not allowed
- 三、寻址方式
- 四、伪指令dd
- 五、指定数据长度
- Ⅰ、以寄存器大小定长度
- Ⅱ、以操作符X ptr定长度
- Ⅲ、其他方法
- 六、dup批量声明数据
- 七、div除法
- Ⅰ、除法的四要素
- Ⅱ、div的格式
- 后记
章末实验
一、bx、bp和si、di
前面提到,可以通过[bx+si+idata]形式定位内存单元。完整地,以[…]寻址的寻址形式如下:
[bx/bp+si/di+idata],其中,任意位置均能为0省略不写
bx和bp区别在于:使用bx,段地址匹配ds;使用bp,段地址匹配ss
二、表达一个数据的位置
通常用以下三个概念表达数据的位置
Ⅰ、立即数——idata
代码中直接给出的数据称为立即数,执行前已经存在CPU的指令缓冲器内
mov ax,1
mov al,'a'
Ⅱ、寄存器——reg
数据存在寄存器内,直接给出寄存器名字
Ⅲ、段地址和偏移地址——SA:EA
数据存在内存内,直接给出地址。地址可以是立即数也可以是寄存器中的数据,用[X]表示
对于地址存放在寄存器中,描述 该地址存放的地址 可以有显性给出或隐性给出,即是否指定段寄存器
- 显性给出:sreg:[reg]、sreg:[bx/bp+si/di+idata]
- 隐性给出:[reg]、[bx/bp+si/di+idata]
immediate operand not allowed
见下文链接
immediate operand not allowed问题解析
三、寻址方式
寻址方式有五种:
寻址方式 | 描述 |
---|---|
直接寻址 | [idata] |
寄存器间接寻址 | [bx/bp/di/si] |
寄存器相对寻址 | [bx/bp/di/si+idata]及其多种写法 |
基址变址寻址 | [bx/bp+di/si]及其多种写法 |
相对基址变址寻址 | [bx/bp+di/si+idata]及其多种写法 |
四、伪指令dd
前面用过db和dw
- db:字节型数据
- dw:字型数据
dd是双字型(dword,double word)数据,占据4B,32位
五、指定数据长度
在C中使用int、long等指定数据的长度,具体到汇编中,有以下三种方式指定:
Ⅰ、以寄存器大小定长度
寄存器是几位的,数据就有多长,分八位和十六位
Ⅱ、以操作符X ptr定长度
若数据存储在内存中,就需要用X ptr
定长度,X可选word或byte
byte ptr
,字节型,大小1B
mov byte ptr ds[0]:1 ;令ds:[0]=00
word ptr
,字型,大小2B
mov word ptr ds[0]:1 ;令ds:[0]和ds:[1]=01和00
Ⅲ、其他方法
如:对于push
出栈,默认对字型操作
六、dup批量声明数据
dup用于批量声明同类型数据,用法如下:
db/dw/dd n dup (data1,data2,…)
使用dup可以迅速获得多个重复的数据
- 空栈:
stack segment
dw 200 dup (0)
stack ends
- 重复数据:
db 3 dup (0,1,2)
七、div除法
Ⅰ、除法的四要素
类比除法的标准形式,div除法的四要素:
- 被除数:默认放在ax和dx或ax中,区别为除数为十六位和八位,高位放在dx或ah,低位放在ax或al
- 除数:有十六位和八位两种,对应被除数三十二位和十六位,放在reg或内存中
- 商:运算后放在低位ax或al中
- 余数:运算后放在高位dx或ah中
低位存商,高位存余数
被除数位数是除数位数的2倍
除数有几位就被称为几位除法
要素类型 | 16位除法 | 8位除法 |
被除数 | 32位,dx存高位ax存低位 | 16位,ah存高位al存低位 |
除数 | 16位 | 8位 |
商 | 存放在低位ax | 存放在低位al |
余数 | 存放在高位dx | 存放在高位ah |
Ⅱ、div的格式
div reg
div SA:EA
编程,利用除法指令计算100001/100和1001/100,其中100001=186A1H
前者的被除数大于65535,后者的被除数小于65535,前者16位除法后者8位除法
实现代码分别如下:
mov dx,1
mov ax,186A1H ;共32位
mov bx,100 ;共16位
div bx
mov ax,1001 ;共16位
mov bl,100 ;共8位
div bl
运算后查看对应的寄存器以获得商和余数
后记
- 养成良好习惯,指明段寄存器。由于系统会将方括号省略将地址认为是立即数,建议显性表示
- 对内存单元操作要定长度
mov
不能直接对两个内存空间操作,需要借助寄存器或栈
最后
以上就是满意小伙为你收集整理的学汇编,记笔记(七)_《汇编语言(第4版)》王爽著——数据处理的基本问题_寻址_div除法_伪指令dd和dup前言一、bx、bp和si、di二、表达一个数据的位置三、寻址方式四、伪指令dd五、指定数据长度六、dup批量声明数据七、div除法后记的全部内容,希望文章能够帮你解决学汇编,记笔记(七)_《汇编语言(第4版)》王爽著——数据处理的基本问题_寻址_div除法_伪指令dd和dup前言一、bx、bp和si、di二、表达一个数据的位置三、寻址方式四、伪指令dd五、指定数据长度六、dup批量声明数据七、div除法后记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复