自学王爽老师《汇编语言》笔记——第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中,只有这四个寄存器可以用在 “[...]” 中来进行内存单元的寻址。
  • 这四种指令若组合出现只能有以下四种组合:
    1. bx 和 si;
    2. bx 和 di;
    3. bp 和 si;
    4. bp 和 di。
  • 只要在 [...] 中使用寄存器 bp,而指令中没有显性给出段地址,段地址就默认在 ss 中。

8.2 机器指令处理的数据在什么地方

  • 绝大部分机器指令都是进行数据处理的指令。
  • 处理大致可以分为三类:读取、写入、运算
  • 从机器指令层面讲,并不关心数据的值是多少,而关心指令执行前一刻,他将要处理的数据所在的位置。
  • 指令执行前数据可以在三个地方:CPU内部、内存、端口

8.3 汇编语言中数据位置的表达

汇编语言用三个概念来表达数据的位置:

  1. 立即数(idata):直接包含在机器指令中的数据。
  2. 寄存器
  3. 段地址(SA)和偏移地址(EA)

8.4 寻址方式

8086CPU的寻址方式总结:

图片说明

8.5 指令要处理的数据有多长

指令如何判断进行的是字操作还是字节操作?

  1. 通过寄存器名指明要处理的数据尺寸。
  2. 在没有寄存器名情况下,用操作符 X ptr 指明内存单元的长度,X 的可选值为 wordbyte
    • 例如:mov byte ptr ds:[0],1
  3. 有些指令默认了访问的是字单元还是字节单元。
    • 例如: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年的人均收入。

#汇编语言##自学##读书笔记#
全部评论
感谢王爽老师分享的《汇编语言》笔记
点赞 回复 分享
发布于 2022-08-27 12:25 河南

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务