汇编多分支结构例题分析
今天朋友问了一道书上的例程,经过复现发现示例程序有一点小问题,顺便复习一下汇编知识(看到这篇的同学汇编必过),话不多说,上程序。
DATA SEGMENT
TABLE dw L1,L2,L3,L4,L5,L6,L7,L8
DATA ENDS
STACK1 SEGMENT ;PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START:
MOV AX,DATA
MOV DS,AX
MOV AH,01H ;输入一个字符送入AL
INT 21H
CMP AL,31H ;输入的字符不在1-8之间,则结束
JB L10
CMP AL,39H
JAE L10
AND AL,0FH ;转换为数字
XOR AH,AH
DEC AL
SHL AL,1h
MOV BX,offset TABLE
ADD BX,AX
JMP word ptr[BX];[BX]
L1:MOV DL,'A'
JMP L9
L2:MOV DL,'B'
JMP L9
L3:MOV DL,'C'
JMP L9
L4:MOV DL,'D'
JMP L9
L5:MOV DL,'E'
JMP L9
L6:MOV DL,'F'
JMP L9
L7:MOV DL,'G'
JMP L9
L8:MOV DL,'H'
JMP L9
L9:
MOV AH,02H
INT 21H
L10:
MOV AH,4CH
INT 21H
CODE ENDS
END START
首先是数据段
DATA SEGMENT
TABLE dw L1,L2,L3,L4,L5,L6,L7,L8
DATA ENDS
这里定义了一个跳转表(类似函数指针数组),里面的每一个字是一个标签,类似于函数声明,注意声明过的标签一定要在代码段实现,不然会报错。
堆栈段
STACK1 SEGMENT ;PARA STACK
DW 20H DUP(0)
STACK1 ENDS
定义了一个长度为20h(32)个字大小的栈,用0填充,程序里没有用到堆栈,不多说
代码段
AND AL,0FH ;转换为数字
XOR AH,AH
DEC AL
SHL AL,1h
MOV BX,offset TABLE
ADD BX,AX
JMP word ptr[BX];[BX]
主要看这部分,首先是将字符转换为数字(ascii码形式)然后清零ah,这里的al的值正好对应相应的数字,可以用其他处理方式
然后al减一,这里al的值相当于数组从0开始的下标,(先这么理解),所以要减一,
然后左移一位,相当于算数乘以2,地址每加一,地址向后偏移一个字节,一个字是两个字节,所以乘以2
最后是jmp,这里书上的代码有问题,jmp在段内跳转时,使用间接寻址即[bx]时要声明其大小,即
JMP word ptr [BX]
详情见《汇编语言程序设计教程 刘恩海 石陆魁主编》P41内容

浙公网安备 33010602011771号