【浅尝辄止】《汇编语言》寻址方式在结构化数据访问中的应用


前言

参考书籍:
王爽。汇编语言。北京:清华大学出版社, 2013:166-173

本人菜狗一枚,不敢咬文嚼字,只能站在巨人的肩膀上窥探一下未曾了解的世界。


寻址方式的综合应用

关于 DEC 公司的一条记录(1982年)

公司名称DEC
总裁姓名Ken Olsen
排名137
收入40(亿美元)
著名产品PDP(小型机)

这些数据被存放在 seg 段中从偏移地址 60H 起始的位置
在这里插入图片描述

起始地址存储形式存储尺寸数据语义
seg:60ASCII3 字节公司名称
seg:60+3ASCII9 字节总裁姓名
seg:60+0C数值1 字型排行
seg:60+0E数值1 字型收入
seg:60+10ASCII3 字节产品名称

DEC 公司信息的变化(1988年)

公司名称DEC
总裁姓名Ken Olsen
排名38
收入70(亿美元)
著名产品VAX

编程任务:修改内存中的过时数据

分析要修改内容:

  • (DEC 公司记录)的(排名字段)
  • (DEC 公司记录)的(收入字段)
  • (DEC 公司记录)的(产品字段)(三个字节,即三个字符)

确认修改方法

  1. (寻址)确认 DEC 公司记录位置:R = seg:60
  2. (寻址)确认排名字段在记录中的位置:0CH
  3. (修改)修改 R + 0CH 处的数据
  4. (寻址)确认收入字段在记录中的位置:0EH
  5. (修改)修改 R+0EH 处的数据
  6. (寻址)确认产品字段在记录中的位置:10H
  7. (寻址)确认第一个字符在产品字段中的位置:P=0,即第一个字符位置
  8. (修改)修改 ** R+10H+P** 处的数据;修改后 P=P+1,即第二个字符位置
  9. (修改)修改 R+10H+P 处的数据;修改后 P=P+1,即第三个字符位置
  10. (修改)修改 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 年的基本情况

年份收入(千美元)雇员(人)人均收入(千美元)
1975163?
1976227?
19773829?
1978135613?
1979239028?
1980800038?
...
199559370017800?

下面程序已经定义好数据

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
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看书的灯泡猫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值