Hello,大家好呀!这是本人的第一篇博客,这学期正好在学汇编语言,上周老师布置了一个作业,用汇编语言实现从键盘输入一个字符,输出其对应的ASCII码。说实话,这个问题最开始的时候令我不知从何下手,明明用c语言只需要几行代码,用汇编来实现却显得十分困难。于是我便搜索了半天却没找到想要的结果,于是只能靠自己解决了问题。现在将我的代码放到下面供大家参考。
这里还得提一下,我们教学使用的是Intel 8086体系的指令集。
这是题目的要求:
这是代码:
data segment
string db 6 dup(?) ;定义一个字符串用来保存每一位字符
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data ;初始化段寄存器
mov ds,ax
mov ah,1 ;从键盘输入一个字符
int 21H
mov ah,0 ;这一步必须要写
mov bh,10
div bh
add ah,30H
mov string+4,ah ;将余数先保存到高位
cbw
div bh
add ah,30H
mov string+3,ah
cbw
div bh
add ah,30H
mov string+2,ah
mov string+5,'$' ;字符串结束标志
mov dl,0AH ;输出一个换行字符
mov ah,2
int 21H
mov dx,offset string ;输出字符串
mov ah,9
int 21H
mov ah,4cH
mov al,0
int 21H
code ends
end start
这是运行的效果:
将上面的代码保存为ascii.asm然后编译为可执行文件ascii.exe
再在dosbox里执行ascii这个命令,就可以看到相应的结果了
现在,我来讲解一下代码的逻辑:
任何一个程序都需要输入和输出,这是最基本的要求。因此,第一步需要搞明白在汇编语言里如何进行输入和输出。
详情见以下链接:
在搞明白如何进行输入与输出后,就进入一个程序的核心步骤,如何通过运算将输入转换为对应的输出:
当我们从键盘输入一个字符后,字符的ASCII码就被存储到AL(al)寄存器里,比如,如果我们从键盘打一个A,那么此时AL寄存器里的数就是65,现在要解决的问题就是如何将数65转换为字符串'065',我们知道字符'0'的ASCII码值是48,而'1'的ASCII码值是49,按照这个规律,我们就可以得到解决思路了。我们可以先用65除以10,得到余数5,再把5加上48就得到了'5'的ASCII码值,将这个ASCII码值存入一个字符串的高位,然后将商继续除以10......
将上面的步骤总共进行三次就可以得到一个三位长度的字符串了。
然后进行输出即可。