Intel 8086下的查表方法,对表的遍历方法
下面的代码是一个查表程序,通过数值表table2查其对应的table1表内的数据。下面的程序是查询数值表table2中0ch对应于table1中的数据1eh。
其中有一段很有用的代码即表的遍历方法,摘在下面:
mov si,0h
mov cx,4h
cld
c1: lodsb
cmp al,dl
jz c2
loop c1
上面的代码通过源变址SI和循环次数寄存器CX,以及方向控制CLD共同来完成表的遍历。
data1 segment
table1 db 2h,1eh,3ch,5ah ;段码表
data2 segment
table2 db 0h,0ch,17h,1h ;查询数值表
data3 segment
table3 db "Error,try again!....$"
data4 segment
table4 db "Succeed!....$"
ends
code segment
start:
mov ax, data2 ;获得数值表table2的段地址
mov ds,ax ;代码段寄存器指向table2
mov dl, 0h ;查询数为0ch
;遍历数值表,以找出所要查询的数值相对数值表表首的相对地址
mov si,0h
mov cx,4h
cld
c1: lodsb
cmp al,dl
jz c2 ;相等则跳转至c2以查询对应段码
loop c1
jmp c3 ;无匹配值着跳转至c3以执行显示错误操作提示
; 根据cx值计算的相对地址作为段码表table1的偏移量加table1表首地址确定相应段码
c2: mov ax,data1 ;获得数值表table2的段地址
mov ds,ax ;代码段寄存器指向table2
mov ax,4h
sub ax,cx ; 计算偏移量为3-cx并送bx
mov bx,ax
mov cl,[bx] ;查出相应段码送dl
jmp c4
c3: mov ax,data3
lea dx,table3
mov ds, ax
mov es, ax
jmp c5
c4: mov ax,data4
lea dx,table4
mov ds, ax
mov es, ax
c5: mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start