美文网首页
汇编学习小记(三)-查表

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

作者: 葭葭葭葭葭 | 来源:发表于2018-05-06 23:33 被阅读0次

    实验目的

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

    参考:课本68页


    windows挂载

    mount c e:\masm
    

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

    1.使用xlat指令进行查表

    【1】.使用xlat指令条件

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

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

    image

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

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

    题目

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

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

    • bx中放置表的首地址值,得到mess[0]
    • al里放你给出的数,hex为第15个
    • xlat
    • 需要查找的内容会放在al里
    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]都是所要获取的数

    image

    2.获取成绩单

    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 ,是我理解错误了

    image

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

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

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

    image

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

    image

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

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

    将AX中的值写入数据段的4000H单元
    MOV DS:[4000H],AX
    
    image image

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

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

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

    image
    • 通过对不同长度名字后方添加空格使得每一个字符串的总长度一致(本实例中长度为16)
    image 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新内容

    image 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

    相关文章

      网友评论

          本文标题:汇编学习小记(三)-查表

          本文链接:https://www.haomeiwen.com/subject/ucvprftx.html