汇编学习小记(三)-查表

实验目的

  • 掌握xlat指令查表方法
  • 通过不同的存储器寻址方式实现查表操作

参考:课本68页


windows挂载

mount c e:\masm

xlat每个单元项在内存中只能占用一个字节

1.使用xlat指令进行查表

【1】.使用xlat指令条件

(1)要求给出的数,与 你要查找的内容在 表中的偏移位置 是相等关系

(2)xlat指令要求你查找的表中的内容不能超过8个二进制位的表示范围

汇编学习小记(三)-查表_第1张图片
image

【2】.使用xlat指令的步骤-al <- bx + al

  • bx中放置表的首地址值
  • al里放你给出的数,你给出来的是 你要查找的内容在表中的偏移位置
  • xlat
  • 你要查找的内容会放在我们的al里面

题目

1.获取给定位置(hex)中的数

(al) <—(bx)+(al)

  • bx中放置表的首地址值,得到mess[0]
  • al里放你给出的数,hex为第15个
  • xlat
  • 需要查找的内容会放在al里
汇编学习小记(三)-查表_第2张图片
image
image
data segment
            sentence db 'qwqwqwqw'
            mess db '0123456789abcdef'
            hex db 0fh  ;hex为我想取出mess中的 mess[hex]位置,此处指 mess[15]=f
data ends
code segment
assume cs:code,ds:data
            start:
            mov ax,data
            mov ds,ax

            ;把mess的偏移地址赋给BX,即BX指向mess[0]
            ;lea bx,mess
            mov bx,offset mess

            ;[hex] 默认为 ds:[hex]
            mov al,[hex]

            xlat
            mov dl,al
            mov ah,2
            int 21h

            mov ah,4ch
            int 21h
code ends
end start

【收获⚠️】

1.给出的数(hex) == 所要查找的内容在 表中的偏移位置

2.ds寄存器不一定是从0开始,要注意不是每一次取ds:[0]都是所要获取的数

汇编学习小记(三)-查表_第3张图片
image

2.获取成绩单

汇编学习小记(三)-查表_第4张图片
image
image
data segment
            table  db '99$','98$','97$'
             db  '89$','88$','87$'
             db  '79$','78$','77$'
data ends
code segment
assume cs:code,ds:data
            start:
            mov ax,data
            mov ds,ax

      mov bl,1  ;想获取第二行第二个数据--88
            mov al,bl

            mov bh,0
            mov bl,9   ;一行里面包括了9个字节的数据(一行九个字节的内存单元)

            mul bl    ;ax=al*1--已经而已到第二行的开头数据

      mov si,3

            mov bx,ax

      ;mov dl,table[bx+si]  是把所在偏移地址的内容放到dl中方
            ;但是我们是想输出是 88$ 那个字符串,应该是它的偏移地址给dx

            mov dx,offset table

            add bx,si
            add dx,bx

            mov ah,9
            int 21h

            mov ah,4ch
            int 21h
code ends
end start

【收获⚠️】

【1】db字节类型-一个字节数据占一个字节单元,读完以后位移量加1

我原本想去除的是成绩 89 ,但是输出的是 8 ,是我理解错误了

汇编学习小记(三)-查表_第5张图片
image

【2】dx(dh、dl)是寄存器,ds是数据段

【3】error A2048:Must be index or base register

错误原因:使用寄存器间接寻址时,只可以使用 BX, BP, SI, DI 这四个寄存器中的一个,不可以使用其它寄存器。

汇编学习小记(三)-查表_第6张图片
image

【4】操作数是字符串在存储单元中的放置

汇编学习小记(三)-查表_第7张图片
image

注意看 db 类型的 ‘hello’ 中在

【5】mov指令是将物理地址XXX存储单元中的存储内容送入寄存器中

将AX中的值写入数据段的4000H单元
MOV DS:[4000H],AX
汇编学习小记(三)-查表_第8张图片
image
汇编学习小记(三)-查表_第9张图片
image

【6】字符串中偏移地址的获取需用offset,而且末尾需要 结束,不可以直接mov dl,table[bx+si] 而是需要先mov dx,offset table ,然后通过add 将si和bx并入到dx中

  • table[si+bx]--是将存储单元中的内容给了出去
  • offset--将偏移地址给了出去

3.使用空格补全姓名进行查找学生姓名的操作

汇编学习小记(三)-查表_第10张图片
image
  • 通过对不同长度名字后方添加空格使得每一个字符串的总长度一致(本实例中长度为16)
汇编学习小记(三)-查表_第11张图片
image
汇编学习小记(三)-查表_第12张图片
image
data segment
            mess db 'Please Input student number:$'
            table db 0ah,0dh,'heaijia      $'
                  db 0ah,0dh,'huangxuechun $'
                  db 0ah,0dh,'zhanghao     $'
                  db 0ah,0dh,'zhangshuo    $'
                  db 0ah,0dh,'liujinyi     $'
data ends
code segment
assume cs:code,ds:data
    start:
    mov ax,data
    mov ds,ax

    mov dx,offset mess
    mov ah,9
    int 21h

    mov ah,1
    int 21h
    sub al,30h

    mov bl,16
    mul bl           ;ax=al*bl

    ;mov dx,offset table
    ;add dx,ax

    mov bx,offset table
    add ax,bx
    mov dx,ax

    mov ah,9
    int 21h

    mov ah,4ch
    int 21h
code ends
end start

【收获⚠️】

【1】长度的计算--串结束符也算做一位,计算错误就出不来了

4.使用dw存t0,t1,t2,t3,t4,t5的形式进行查表,t0,t1,t2,t3,t4,t5指向db新内容

汇编学习小记(三)-查表_第13张图片
image
汇编学习小记(三)-查表_第14张图片
image
data segment
    mess db 'Please Input student number:$'
    sign dw q1,q2,q3,q4,q5
        ;db 1  2  3  4  5
        ;dw 2  4  6  8  10
        q1 db 0ah,0dh,'heaijia$'
        q2 db 0ah,0dh,'huangxuechun $'
        q3 db 0ah,0dh,'zhangha$'
        q4 db 0ah,0dh,'z$'
        q5 db 0ah,0dh,'buxiwangongzuoshizongfuzerenheaijia$'
data ends
code segment
assume cs:code,ds:data
    start:
        mov ax,data
        mov ds,ax

        mov dx,offset mess
        mov ah,9l
        int 21h

        mov ah,1
        int 21h
        sub al,30h

        mov ah,0
        add ax,ax

        mov bx,ax
        mov dx,sign[bx]

        mov ah,9
        int 21h

        mov ah,4ch
        int 21h

code ends
end start

六大寻址方式

image

你可能感兴趣的:(汇编学习小记(三)-查表)