代码转换是计算机应用中常见问题,计算机内部职能进行二进制的运算,而输入设备提供的是数和字符的ASCII码形式。所以必须把ASCII码形式表达的十进制数或其他进制数转换成二进制数。同样,当数据处理结束后,也需要进行相应的转换,将二进制码转换为输出需要的ASCII码或者十进制数给显示器。这一节我就说说关于进制的转换。
一、十六进制ASCII码与二进制数之间的转换
首先我们将十六个字符所在的区域分成 3部分,分别是区域1表示十六进制数中0--9之间的数字字符,区域2表示十六进制数中A--F之间的数字字符;区域3表示十六进制中的a--f之间的数字字符。
如果我们仔细观察过它们各自对应的ASCII码值和二进制值得话,我们不难会发现以下规律:
1、对于字符0--9的ASCII来说,其字符ASCII码的低4位与所表示的十六进制数相同,也就是ASCII码对应的二进制数的低4位,因此,对于区域1的十六进制ASCII码与二进制之间的转换,就是讲ASCII码的高4位加上或者去掉即可。
2、区域2中的字符A--F的ASCII码,其ASCII码减7后的二进制数的低4位与对应的二进制数低4位相同,因此可以用此方法得到二进制数的低4位,而高4位则可以通过加减30H得到
3、区域3中的字符a--f的ASCII码,其字符ASCII码减7后的二进制数低4位与对应的二进制数低4位相同,因此,可以用此方法得到二进制数的低4位, 而高4位则可以通过加减50H得到。
二、串的操作
串就是指存储器中一序列的字或字节单元,串操作就是对这一个序列字或者字节单元进行某种相同的操作,这一序列可能存放的是字符或者是数据。8086/8088指令系统中有5种串操作指令,下面我一一为大家列举:
1、取串指令LODS
指令格式:LODS
源串
此指令把源串中的一个字或者字节内容送入到AX或者AL中,同时按照DF修改SI。由于源串的字符或者字节单元由SI锁指向,而指令中“源串”主要是指明取的源串是字还是字节,所以,当我们使用该指令的时候,如果已明确源串是字还是字节,那么可用下述3个无操作数的指令格式进行取代。
- LODSB;取源串一个字节
- LODSW;取源串一个字
- LODSB指令可以替代下面的两条指令
- MOV AL, [SI];传送一个字节至AL
- INC SI;指向下一个字节
注:取指令操作是对标志寄存器无影响的。
2、存串指令STOS
指令格式:STOS
目的串
此指令把AX或AL的内容送入目的串中的一个字或字节,同时按照DF修改DI,目的串的字或字节单元是由DI指定的,如果已明确目的串是字还是字节,我们依然可以像取串指令一样去用两个无操到目的串去代替
- STOSB;送字节到目的串
- STOSW;送字到目的串
注:存串操作对标志寄存器无影响的。
3、串传送指令MOVS
指令格式:MOVS
目的串, 源串
把源串中的一个字或字节传送到目的串中,同时按照DF修改SI和DI,由于传送字或字节单元的源串和目的串地址分别由SI和DI指向,如果已明确待传送的源串是字还是字节,那么可用下述两个无操作数指令格式替代:
- MOVSB;字节传送
- MOVSW;字传送
注:串传送指令对标志寄存器无影响
4、串比较指令CMPS
指令格式:CMPS
源串, 目的串
比较源串和目的串中一个字或字节。比较方法是:源串中一个字或者字节减去目的串中一个字或字节,不保留相减结果,但在标志寄存器中反映了比较结果,每比较一次,同时按照DF修改SI和DI,由于比较的字或字节单元地址已由SI和DI指向,如果已明确待比较的串是字或字节,那么可用下述两个无操作数的指令进行执行:
- CMPSB;字节比较
- CMPSW;字比较
5、串搜索指令SCAS
指令格式:SCAS
目的串
在目的串中查找AX和AL指定的内容,查找的方法是用AX或AL的内容减去目的串中的一个字或字节,相减的结果反映在标志寄存器中,每查找一次,按照DF修改DI。由于在查找的字或字节在AX/AL和DI所指向的存储单元,可以用无操作数指令代替:
- SCASB;按字节查找目的串
- SCASW;按字查找目的串
6、重复前缀指令REP
西陵格式:REP
我们为了对若干个字或字节进行相同的操作,可用重复前缀指令REP,它可以使串操作指令重复执行,重复的次数由CX的内容来确定,重复前缀指令使用时,只能放在串操作指令前面,每执行一次串操作指令,CX减1,知道CX=0为止。
本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/940834,如需转载请自行联系原作者