Contents
  1. 1. 基础知识:
    1. 1.1. 伪指令:
    2. 1.2. 汇编指令 div
    3. 1.3. 寻址方式
    4. 1.4. 寻址数据段
  2. 2. 代码
  3. 3. 致谢

很能考验对寻址的理解,挺不错的一道题目

基础知识:

伪指令:

  • db -> 字节
  • dw -> 字
  • dd -> 双字

汇编指令 div

div 为除法指令

被除数默认存放在,AX或DX和AX中:

如果除数为8位,被除数则为16位,默认在AX中存放;
如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位;

结果:如果除数为8位,AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操所的余数

格式:

1
2
div reg
div 内存单元

reg为寄存器

寻址方式

格式 名称 用途 含义
[bx].idata 基址变址寻址 用于二维数组 SA=ds;EA=(bx+idata)
[bx].idata[si] 相对基址变址寻址 用于表格(结构)中的数组项 SA=(ds); EA=(bx)+(si)+idata

SA为段地址 EA为偏移地址

行为数据结构 bx
列为数据项 idata
细分的为数据项元素 si

寻址数据段

  • ds:[bp] 读取表示年份的字符串数据
  • ds:[bp-4+85] 读取表示公司总收入的低16位数据
  • ds:[bp-4+87] 读取表示公司总收入的高16位数据
  • ds:[bp-4+169] 读取表示21年公司雇员人数数据

代码

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
74
75
76
77
78
79
80
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983';9
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995';3
db ' '
;以上是表示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,2258,2793,4037,5635,8226;17
dw 11542,14430,15257,17800;4
;以上是表示21年公司雇员人数的21个word型数据
data ends

table segment
db 336 dup (0);每列16个字节*21行=336字节
table ends

stack segment
db 16 dup(0)
stack ends

code segment
start:mov ax,data
mov ds,ax;将data数据段付给ds数据段寄存器
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bp,0;存放data段数据偏移
mov bx,0;存放数据结构偏移
mov cx,21
s:call year;输入年份
call income;输入月份
call Employee;输入雇员数
call pcincome;输入人均收入
add bx,16
loop s
year:push cx;输入年份的数据
mov si,0;存放数据元素偏移
mov cx,4
y:mov al,ds:[bp]
mov es:[bx].0[si],al
inc si
inc bp
loop y
pop cx
mov al,ds:[84];输入空格
mov es:[bx].0[si],al
ret
income:mov si,0;存放收入数据,双字型数据进行存储时,用ax存放低16位,用dx存放高16位
mov ax,ds:[bp-4+85];存放低16位的收入
mov dx,ds:[bp-4+87];存放高16位的收入
mov es:[bx].5[si],ax
add si,2
mov es:[bx].5[si],dx
add si,2
mov al,ds:[84]
mov es:[bx].5[si],dx
Employee:mov si,0;存放雇员数
mov ax,ds:[bp-4+169]
mov es:[bx].10[si],ax
add si,2
mov al,ds:[84]
mov es:[bx].10[si],al
pcincome:mov si,0;存放人均收入
mov ax,ds:[bp-4+85];存放低16位的收入
mov dx,ds:[bp-4+87];存放高16位的收入
mov di,ds:[bp-4+169]
div di
mov es:[bx].13[si],ax
mov al,ds:[84]
add si,2
mov es:[bx].13[si],al
mov ax,4c00h
int 21h
code ends
end start

致谢

1
《汇编语言》第三版 王爽老师
Contents
  1. 1. 基础知识:
    1. 1.1. 伪指令:
    2. 1.2. 汇编指令 div
    3. 1.3. 寻址方式
    4. 1.4. 寻址数据段
  2. 2. 代码
  3. 3. 致谢