0%

《汇编语言》(第四版) 实验 7

《汇编语言(第四版)》 . 王爽著 . 清华大学出版社 . 2019

实验 7 寻址方式在结构化数据访问中的应用

数据处理的基本问题

数据处理的两个基本问题:
1)处理的数据在何处?
2)处理的数据有多长?

在何处?

汇编语言中用三个概念来表达数据的位置,即立即数、寄存器、段地址(SA)和偏移地址(EA)

立即数:直接包含在机器指令中的数据

1
add bx,2000H

寄存器:指令要处理的数据在寄存器中

1
mov ds,ax

段地址(SA)和偏移地址(EA):指令要处理的数据在内存中,在指令中用 [X] 的格式给出 EA,SA 在某个段寄存器中
注意,只有 bx、si、di 和 bp 这 4 个寄存器可以用在 [...] 中来进行内存单元的寻址

1
2
mov ax,[bx+si+8]              ;隐式给出存放段地址的寄存器
mov ax,es:[bx] ;显式给出存放段地址的寄存器

寻址方式总结

有多长?

8086CPU 的指令,可以处理两种尺寸的数据,byte 和 word,在机器指令中要指明,指令进行的是字操作还是字节操作,常见的处理方法有三种

1)通过寄存器名指明指令进行的是字操作还是字节操作

1
2
mov ds:[0],ax                 ;字操作
mov al,ds:[0] ;字节操作

2)用操作符 word ptrbyte ptr 指明内存单元的长度,注意,在没有寄存器参与的内存单元访问指令中,用操作符显性地指明所要访问的内存单元的长度是很有必要的

1
2
mov word ptr ds:[0],1         ;字操作
inc byte ptr ds:[0] ;字节操作

3)有些指令默认了访问的是字单元还是字节单元,例如 push 指令就只进行字操作

结构化数据访问

[bx+si+idata] 的寻址方式为结构化数据的处理提供了方便,我们可以用 bx 定位整个结构体,用 idata 定位结构体中的某一个数据项,用 si 定位数组项中的每个元素,为此,有更贴切的书写方式:[bx].idata[bx].idata[si]

实验任务


思路都写在注释中了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
assume cs:code,ds:data,ss:stack

data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上表示 21 年的 21 个字符串(84 个字节)

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 型数据(84 个字节)(dd 即 define double word)

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,11430,15257,17800
;以上是表示 21 年公司雇员的 21 个 word 型数据(42 个字节)
;data 段一共占 E0H 的内存空间(重要)
data ends

table segment
db 21 dup ('year summ ne ?? ')
;dup 用来进行数据的重复,这里为 21 个 16 字节
table ends

stack segment
dw 0,0,0,0,0,0,0,0
stack ends

code segment

start: mov ax,data
mov ds,ax ;ds 存储 data 段的段地址
mov ax,stack
mov ss,ax
mov sp,16 ;设置 16 个字节的栈空间

mov bx,0
mov bp,0
mov di,0
mov cx,21 ;设置外层循环的 cx

s1: push cx ;保存外层循环的 cx
mov cx,4 ;设置内层循环的 cx,年份长度为 4 个字节,(cx)=4
mov si,0

s2: mov al,ds:[bp+si]
mov ds:[bx].0e0h[si],al ;e0h 为 data 段长度
inc si
loop s2 ;完成年份的复制

mov ax,ds:[bp].54h
mov ds:[bx+5].0e0h,ax
mov dx,ds:[bp+2].54h
mov ds:[bx+7].0e0h,dx ;完成收入的复制,同时做好除法指令的准备
;被除数为 32 位,dx 存放高 16 位,ax 存放低 16 位

div word ptr ds:[di].0a8h ;做除法
mov dx,ds:[di].0a8h
mov ds:[bx+0ah].0e0h,dx ;完成雇员数的复制
mov ds:[bx+0dh].0e0h,ax ;ax 中存放的是除法的商,即人均收入
;将其复制到 table 段中

add bx,16 ;换行
add bp,4
add di,2
pop cx ;恢复外层循环的 cx
loop s1

mov ax,4c00h
int 21h

code ends

end start
用 Debug 跟踪程序运行


汇编语言实验合集

汇编语言实验合集

实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
实验 2 用机器指令和汇编指令编程
实验 3 编程、编译、连接、跟踪
实验 4 [bx] 和 loop 的使用
实验 5 编写、调试具有多个段的程序
实验 6 实践课程中的程序
实验 7 寻址方式在结构化数据访问中的应用
实验 8 分析一个奇怪的程序
实验 9 根据材料编程
实验 10 编写子程序
课程设计 1
实验 11 编写子程序
实验 12 编写 0 号中断的处理程序
实验 13 编写、应用中断例程
实验 14 访问 CMOS RAM
实验 15 安装新的 int9 中断例程
实验 16 编写包含多个功能子程序的中断例程
实验 17 编写包含多个功能子程序的中断例程
课程设计 2