文章目录
前言
参考书籍:
王爽。汇编语言。北京:清华大学出版社, 2013:166-173
本人菜狗一枚,不敢咬文嚼字,只能站在巨人的肩膀上窥探一下未曾了解的世界。
寻址方式的综合应用
关于 DEC 公司的一条记录(1982年)
公司名称 | DEC |
---|---|
总裁姓名 | Ken Olsen |
排名 | 137 |
收入 | 40(亿美元) |
著名产品 | PDP(小型机) |
这些数据被存放在 seg 段中从偏移地址 60H 起始的位置
起始地址 | 存储形式 | 存储尺寸 | 数据语义 |
---|---|---|---|
seg:60 | ASCII | 3 字节 | 公司名称 |
seg:60+3 | ASCII | 9 字节 | 总裁姓名 |
seg:60+0C | 数值 | 1 字型 | 排行 |
seg:60+0E | 数值 | 1 字型 | 收入 |
seg:60+10 | ASCII | 3 字节 | 产品名称 |
DEC 公司信息的变化(1988年)
公司名称 | DEC |
---|---|
总裁姓名 | Ken Olsen |
排名 | 38 |
收入 | 70(亿美元) |
著名产品 | VAX |
编程任务:修改内存中的过时数据
分析要修改内容:
- (DEC 公司记录)的(排名字段)
- (DEC 公司记录)的(收入字段)
- (DEC 公司记录)的(产品字段)(三个字节,即三个字符)
确认修改方法
- (寻址)确认 DEC 公司记录位置:R = seg:60
- (寻址)确认排名字段在记录中的位置:0CH
- (修改)修改 R + 0CH 处的数据
- (寻址)确认收入字段在记录中的位置:0EH
- (修改)修改 R+0EH 处的数据
- (寻址)确认产品字段在记录中的位置:10H
- (寻址)确认第一个字符在产品字段中的位置:P=0,即第一个字符位置
- (修改)修改 ** R+10H+P** 处的数据;修改后 P=P+1,即第二个字符位置
- (修改)修改 R+10H+P 处的数据;修改后 P=P+1,即第三个字符位置
- (修改)修改 R+10H+P 处的数据
编程修改
汇编风格
mov ax, seg
mov ds, ax
mov bx, 60h
mov word ptr [bx+0ch], 38
mov word ptr [bx+0eh], 70
mov si, 0
mov byte ptr [bx+10h+si], 'V'
inc si
mov byte ptr [bx+10+si], 'A'
inc si
mov byte ptr [bx+10h+si], 'X'
C 语言风格
mov ax, seg
mov ds, ax
mov bx, 60h
mov word ptr [bx].0ch, 38
mov word ptr [bx].0eh, 70
mov si, 0
mov byte ptr [bx].10h[si], 'V'
inc si
mov byte ptr [bx].10h[si], 'A'
inc si
mov byte ptr [bx].10h[si], 'X'
寻址方式在结构化数据访问中的应用
Power idea 公司从 1975 年成立一直到 1995 年的基本情况
年份 | 收入(千美元) | 雇员(人) | 人均收入(千美元) |
---|---|---|---|
1975 | 16 | 3 | ? |
1976 | 22 | 7 | ? |
1977 | 382 | 9 | ? |
1978 | 1356 | 13 | ? |
1979 | 2390 | 28 | ? |
1980 | 8000 | 38 | ? |
... | |||
1995 | 593700 | 17800 | ? |
下面程序已经定义好数据
assume cs:codesg
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'
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
编程,将 data 段中的数据按如下格式写入到 table 段中,并计算 21 年的人均收入(取整)
assume cs:codesg
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'
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
codesg segment
start:
mov ax, data
mov ds, ax
mov ax, table
mov es, ax
mov si, 0
mov di, 0
mov bx, 0
mov cx, 21
s:
mov ax, [si]
mov es:[bx], ax
mov ax, [si+2]
mov es:[bx+2], ax
mov ax, [si].84
mov es:[bx+5], ax
mov ax, [si+2].84
mov es:[bx+7], ax
mov ax, [di].168
mov es:[bx+10], ax
mov ax, es:[bx+5]
mov dx, es:[bx+7]
div word ptr es:[bx+10]
mov es:[bx+13], ax
add di, 2
add si, 4
add bx, 16
loop s
mov ax, 4c00h
int 21h
codesg ends
end start