转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne
数据处理涉及到两个基本问题:
(1). 处理的数据在什么地方?(内存,寄存器,端口还是指令缓冲器)
(2).要处理的数据有多长?(byte, word, dword)
☞寄存器总结
- 寄存器 reg:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;
- 段寄存器sreg:ds、ss、cs、es.
☞bx、si、di、bp
- 在[…]中,这4个寄存器可以单个 出现,或者只能以4中组合出现(bx/bp+si/di):bx和si、bx和di、bp和si、bp和di。
正确指令:
错误指令:
- 在[...]中使用bp,默认的段地址是ss中。
但是可以指定段寄存器:
mov ax, ds:[bp] ; (ax)=((ds)*16+(bp))
mov ax, es:[bx] ; (ax)=((es)*16+(bx))
☞第一个基本问题:处理的数据在什么地方?
- 绝大部分机器指令都是进行数据处理的指令,处理大致分为3类:读取、写入、运算。而所要处理的数据可以在3个地方:CPU内部、内存和端口。
- 数据的位置:
类型 | 位置 | 示例 |
立即数(idata) | 直接包含在机器指令的数据(CPU的指令缓冲器) | mov ax,1 |
寄存器 | 寄存器中 | mov ax, bx |
段地址(SA)和偏移地址(EA) | 内存中 | mov ax, ds:[0] |
☞总结:寻址方式(超全版本)
☞第二个基本问题:要处理的数据有多长?
- 8086CPU的处理能力
8086CPU的指令,可以处理两种尺寸数据:byte和word。所以可分为:字操作和字节操作。
- 指令如何指明是字操作还是字节操作?
方法 | 示例 |
通过寄存器指明要处理的数据的尺寸 |
|
X ptr指明内存单元的长度 |
|
指令的默认方式(push/pop默认字操作) | push [1000H] pop [1000H] |
☞C语言和汇编语言的寻址方式(对比)
- 问题描述:关于DEC公司的一条记录(1982年)如下:
公司名称:DEC
总裁姓名:Ken Olsen
排 名:137
收 入:40(40亿)
著名产品:PDP
任务:公司到了1988年,DEC公司的信息发生了如下变化:
(1) Ken OSen在富豪榜上的排名上升至38位;
(2) DEC的收入增加了70亿美元;
(3) 该公司的著名产品已变为VAX系列计算机
- 数据存放示意
- C语言的处理方式
- Assembly的处理方式
- 重点:Assembly和C的处理方式类比
类比:
- 8086CPU提供了[bx+si+idata]的寻址方式可以方便处理结构化数据。
- bx定位整个结构体,idata定位结构体重的某一个数据项,用si定位数组项中的每一个元素。所以:[bx].idata和[bx].idata[si]更加优雅(和C语言很像)。
- dec.cp[i]对应于bx.10h[si]。
☞div指令
示例:
☞伪指令 db dw dd
- 含义
date segment
db 1
dw 1
dd 1
date ends
第一个数据位01H,在data:0处,占1个字节。
第二个数据位0001H,在data:1处,占2个字节。
第三个数据位00000001H,在data:3处,占4个字节。
- 应用:用div计算data段中第一个数据除以第二个数据后的结构,商存在第三个数据的存储单元中。
assume ds:data, cs:code
data segment
dd 1000001
dw 100
dw 0
data ends
code segment
start: mov ax, data
mov dx, ax
mov ax, ds:[0]
mov dx, ds:[2]
div word ptr ds:[4]
mov ds:[6], ax
code ends
end start
☞操作符dup
- 操作符dup是由编译器识别处理的。它和db、dw、dd等数据定义伪指令配合使用。
- 用法
db/dw/dd 重复次数 dup (重复的数据)
- 示例
db 3 dup (0) | db 0 0 0 |
db 3 dup (0,1,2) | db 0,1,2,0,1,2,0,1,2 |
db 3 dup ('abc', 'ABC') | db 'abcABCabcABCabcABC' |
- 如何定义200个字节的栈端
stack segment
db 200 dup (0)
stack end