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

1,271 阅读4分钟

实验目的

  • 掌握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

六大寻址方式