程序完成的功能就是,计算1加到100的值,然后转换成16进制输出
下边是加了注释的代码:
DATA SEGMENT ;数据段定义
SUM DW ? ;定义字形变量SUM,初值为空
DATA ENDS ;数据段定义结束
CODE SEGMENT ;代码段定义
ASSUME CS:CODE,DS:DATA ;指定CS,DS分别表示什么
START:
MOV AX,DATA ;数据段地址存入AX
MOV DS,AX ;让DS数据段寄存器指向数据段
MOV AX,0 ;AX初值为0
MOV BX,0 ;BX初值为0
COUNT: ;完成功能就是计算1加到100的值,也就是5050
INC AX ;每次AX+1
ADD BX,AX ;然后把这个值加到BX中
CMP AX,100 ;比较AX和100
JL COUNT ;如果AX小就继续这个COUNT的循环
MOV SUM,BX ;当AX=100的时候,把BX中的值存到SUM中,就是5050
;16进制表示就是13BAH
MOV CL,12 ;CL赋值为12
S:
MOV BX,SUM ;将5050(13BAH)赋值给BX
SAR BX,CL ;BX右移CL位,就是分别取出13BAH的1,3,B,A4个数
;右移4位则16进制数的最后一位消失,变成13BH
AND BX,15 ;与15就是1111B相与,就是只保留最后四位的值
CMP BX,10 ;这个值与10比较,小于10就是数字,大于10就是字母
JL NUM ;小于就转到NUM,也就是输出数字
JMP HEXCHAR ;否则转到HEXCHAR,也就是输出字母
NUM:
MOV DL,BL ;输出BX中保存的数字
ADD DL,30H ;加上30H将其转换成ASCII码输出
MOV AH,2
INT 21H
JMP NEXT ;跳转到NEXT
HEXCHAR:
MOV DL,BL ;输出BX中保存的字母
ADD DL,55 ;加上55,转换成ASCII码输出大写字母
MOV AH,2
INT 21H
NEXT:
SUB CL,4 ;CL-4,CL=12时取13BAH的第一位1H,CL=8时取13BAH的第二位3H
CMP CL,0
JGE S ;跳转到S,依次取到13BAH的4位输出
EXIT:
MOV AH,4CH ;程序结束
INT 21H
CODE ENDS
END START
MOV AX,DATA;把数据段的段地址送给ds寄存器
MOV DS,AX
MOV AX,0;对ax清零
MOV BX,0;对bx清零
COUNT:
INC AX;将ax加一,得ax=1
ADD BX,AX;将bx与ax相加然后把结果送给bx,得bx=1
CMP AX,100;比较ax与100的大小
JL COUNT;如果ax小与100就转向count,循环执行,直到ax=100为止,此时bx=1+2+...+99+100=5050
MOV SUM,BX;把bx的值送给sum,得sum=5050D=13baH
MOV CL,12;给cl赋初值,控制初始移动位数
S:
MOV BX,SUM;把sum的值送给bx,即bx=13baH
SAR BX,CL;将bx算数右移12位,得bx=0001H
AND BX,15 ;已知15D=000fH,即将bx 与000f相与。意在只保留bx的后四位,其余的清零。(这四位就是起初bx的高四位)
CMP BX,10;与10比较
JL NUM;小于10就转到num,转为数字的ASCII码等待输出
JMP HEXCHAR;否则就转为A~F字符的ASCII码等待输出
NUM:
MOV DL,BL;将bl送给dl,等待输出
ADD DL,30H;将数字转为其ASCII值,以输出对应的的字符形式
MOV AH,2
INT 21H;系统功能调用输出字符
JMP NEXT;转到next,准备输出下一位十六进制数
HEXCHAR:
MOV DL,BL;类似于上面,只是将A~F转为其ASCII形式,等待输出A~F
ADD DL,55
MOV AH,2
INT 21H
NEXT:
SUB CL,4;每次cl减四,来控制循环次数
CMP CL,0;比较cl与0的大小
JGE S ;cl小于零,就跳到s,循环四次之后就终止循环了
EXIT:
MOV AH,4CH
INT 21H
如还有不懂的,乐意为你解答!