汇编多分支结构例题分析

今天朋友问了一道书上的例程,经过复现发现示例程序有一点小问题,顺便复习一下汇编知识(看到这篇的同学汇编必过),话不多说,上程序。

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内容

posted @ 2023-12-25 23:21  CV小能手chh  阅读(5)  评论(0)    收藏  举报  来源