自学王爽老师《汇编语言》笔记——第8章 数据处理两个基本问题
第8章 数据处理的两个基本问题
为了描述的简洁,约定使用reg来表示一个寄存器,用sreg来表示一个段寄存器。
- reg集合:ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;
- sreg集合:ds, ss, cs, es。
8.1 bx、si、di和bp
- 在8086CPU中,只有这四个寄存器可以用在 “[...]” 中来进行内存单元的寻址。
- 这四种指令若组合出现只能有以下四种组合:
- bx 和 si;
- bx 和 di;
- bp 和 si;
- bp 和 di。
- 只要在 [...] 中使用寄存器 bp,而指令中没有显性给出段地址,段地址就默认在 ss 中。
8.2 机器指令处理的数据在什么地方
- 绝大部分机器指令都是进行数据处理的指令。
- 处理大致可以分为三类:读取、写入、运算。
- 从机器指令层面讲,并不关心数据的值是多少,而关心指令执行前一刻,他将要处理的数据所在的位置。
- 指令执行前数据可以在三个地方:CPU内部、内存、端口。
8.3 汇编语言中数据位置的表达
汇编语言用三个概念来表达数据的位置:
- 立即数(idata):直接包含在机器指令中的数据。
- 寄存器
- 段地址(SA)和偏移地址(EA)
8.4 寻址方式
8086CPU的寻址方式总结:
8.5 指令要处理的数据有多长
指令如何判断进行的是字操作还是字节操作?
- 通过寄存器名指明要处理的数据尺寸。
- 在没有寄存器名情况下,用操作符
X ptr
指明内存单元的长度,X 的可选值为word
或byte
。- 例如:mov byte ptr ds:[0],1
- 有些指令默认了访问的是字单元还是字节单元。
- 例如:push 指令只进行字操作。
8.6 寻址方式的综合应用
- 8086CPU提供了 [bx + si + idata] 的寻址方式为结构化数据的处理提供了方便。
- 用 bx 定位结构体,用 idata 定位结构体中的某一个数据项,用 si 定位数据项中的每个元素。
8.7 div指令
div是除法指令,使用时应注意以下问题:
- 除数:有8位和16位两种,在一个reg或内存单元中。
- 被除数:默认存放在AX 或 DX和AX中。
- 除数8位,被除数16位:在AX中存放
- 除数16位,被除数32位,在DX和AX中存放,其中DX存放高16位
- 结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。
- 格式如下:
div reg
div 内存单元
除数位数 | 被除数 | 除数 | 商 | 余数 |
---|---|---|---|---|
8位 | AX | reg或内存单元 | AL | AH |
16位 | DX(高16位)AX(低16位) | reg或内存单元 | AX | DX |
8.8 伪指令 dd
dd 是用来定义dword(double word)型数据的。
8.9 dup
- dup 是一个操作符,在汇编语言中同 db、dw、dd 等一样,也是由编译器识别处理的符号。
- 它和 db、dw、dd 等数据定义伪指令配合使用,用来进行数据的重复。
- 用法:
- db 重复的次数 dup (重复的字节型数据)
- dw 重复的次数 dup (重复的字型数据)
- dd 重复的次数 dup (重复的双字型数据)
实验7 寻址方式在结构化数据访问中的应用
assume cs:codesg, ss:stacksg datasg segment db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982' db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990' db '1991', '1992', '1993', '1994', '1995' ;以上是表示21年的21个字符串 dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514 dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000 ;以上是表示21年公司总收入的21个dword型数据 dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442 dw 2258, 2793, 4037, 5635, 8226, 11542, 14430, 15257, 17800 ;以上是表示21年公司雇员人数的21个word型数据 datasg ends table segment ;0123456789ABCDEF db 21 dup ('year summ ne ?? ') table ends stacksg segment db 16 dup(0) stacksg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov ax,table mov es,ax mov si,0 ;ds:[si] mov di,84 ;ds:[di] mov bx,168 ;ds:[bx] mov bp,0 ;es:[bp] mov cx,21 fiTab: push ds:[si] pop es:[bp] push ds:[si + 2] pop es:[bp + 2] mov ax,ds:[di] mov dx,ds:[di + 2] mov es:[bp + 5],ax mov es:[bp + 7],dx push ds:[bx] pop es:[bp + 0ah] div word ptr ds:[bx] mov es:[bp + 0dh],ax add si,4 add di,4 add bx,2 add bp,16 loop fiTab mov ax,4c00h int 21h codesg ends end start
实现了统计 Power idea 公司从1975年起21年的人均收入。
#汇编语言##自学##读书笔记#