实验目的
- 掌握xlat指令查表方法
- 通过不同的存储器寻址方式实现查表操作
参考:课本68页
windows挂载
mount c e:\masm
xlat每个单元项在内存中只能占用一个字节
1.使用xlat指令进行查表
【1】.使用xlat指令条件
(1)要求给出的数,与 你要查找的内容在 表中的偏移位置 是相等关系
(2)xlat指令要求你查找的表中的内容不能超过8个二进制位的表示范围
【2】.使用xlat指令的步骤-al <- bx + al
- bx中放置表的首地址值
- al里放你给出的数,你给出来的是 你要查找的内容在表中的偏移位置
- xlat
- 你要查找的内容会放在我们的al里面
题目
1.获取给定位置(hex)中的数
(al) <—(bx)+(al)
- bx中放置表的首地址值,得到mess[0]
- al里放你给出的数,hex为第15个
- xlat
- 需要查找的内容会放在al里
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]都是所要获取的数
2.获取成绩单
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 ,是我理解错误了
【2】dx(dh、dl)是寄存器,ds是数据段
【3】error A2048:Must be index or base register
错误原因:使用寄存器间接寻址时,只可以使用 BX, BP, SI, DI 这四个寄存器中的一个,不可以使用其它寄存器。
【4】操作数是字符串在存储单元中的放置
注意看 db 类型的 ‘hello’ 中在
【5】mov指令是将物理地址XXX存储单元中的存储内容送入寄存器中
将AX中的值写入数据段的4000H单元
MOV DS:[4000H],AX
【6】字符串中偏移地址的获取需用offset,而且末尾需要 结束,不可以直接mov dl,table[bx+si] 而是需要先mov dx,offset table ,然后通过add 将si和bx并入到dx中
- table[si+bx]--是将存储单元中的内容给了出去
- offset--将偏移地址给了出去
3.使用空格补全姓名进行查找学生姓名的操作
- 通过对不同长度名字后方添加空格使得每一个字符串的总长度一致(本实例中长度为16)
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新内容
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