那些年,我们一起学过的汇编----之进制转换和串的操作-阿里云开发者社区

开发者社区> 技术小胖子> 正文

那些年,我们一起学过的汇编----之进制转换和串的操作

简介:
+关注继续查看

代码转换是计算机应用中常见问题,计算机内部职能进行二进制的运算,而输入设备提供的是数和字符的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个无操作数的指令格式进行取代。
 

  1. LODSB;取源串一个字节 
  2. LODSW;取源串一个字 
  3. LODSB指令可以替代下面的两条指令 
  4. MOV AL, [SI];传送一个字节至AL 
  5. INC SI;指向下一个字节 
注:取指令操作是对标志寄存器无影响的。
2、存串指令STOS
指令格式:STOS 目的串
此指令把AX或AL的内容送入目的串中的一个字或字节,同时按照DF修改DI,目的串的字或字节单元是由DI指定的,如果已明确目的串是字还是字节,我们依然可以像取串指令一样去用两个无操到目的串去代替
 

  1. STOSB;送字节到目的串 
  2. STOSW;送字到目的串 
注:存串操作对标志寄存器无影响的。
3、串传送指令MOVS
指令格式:MOVS 目的串, 源串
把源串中的一个字或字节传送到目的串中,同时按照DF修改SI和DI,由于传送字或字节单元的源串和目的串地址分别由SI和DI指向,如果已明确待传送的源串是字还是字节,那么可用下述两个无操作数指令格式替代:
 

  1. MOVSB;字节传送 
  2. MOVSW;字传送 
注:串传送指令对标志寄存器无影响
4、串比较指令CMPS
指令格式:CMPS 源串, 目的串
比较源串和目的串中一个字或字节。比较方法是:源串中一个字或者字节减去目的串中一个字或字节,不保留相减结果,但在标志寄存器中反映了比较结果,每比较一次,同时按照DF修改SI和DI,由于比较的字或字节单元地址已由SI和DI指向,如果已明确待比较的串是字或字节,那么可用下述两个无操作数的指令进行执行:
 

  1. CMPSB;字节比较 
  2. CMPSW;字比较 
5、串搜索指令SCAS
指令格式:SCAS 目的串
在目的串中查找AX和AL指定的内容,查找的方法是用AX或AL的内容减去目的串中的一个字或字节,相减的结果反映在标志寄存器中,每查找一次,按照DF修改DI。由于在查找的字或字节在AX/AL和DI所指向的存储单元,可以用无操作数指令代替:
 

  1. SCASB;按字节查找目的串 
  2. SCASW;按字查找目的串 
6、重复前缀指令REP
西陵格式:REP
我们为了对若干个字或字节进行相同的操作,可用重复前缀指令REP,它可以使串操作指令重复执行,重复的次数由CX的内容来确定,重复前缀指令使用时,只能放在串操作指令前面,每执行一次串操作指令,CX减1,知道CX=0为止。
 
 
 
 
     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/940834,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
用Linux/Unix命令把十六进制转换成十进制(转)
那天写个脚本,需要把十六进制的数字转成十进制的打出来,发现不知道要怎么弄,搜一下,原来还是很简单的,比用C语言什么的容易多了,就一些现成的命令就解决了。 先列两种简单的方法: 1) echo 自己就能实现,相当简单。
845 0
将16进制字符串转换成16进制数据
var tb1 = Tb1.Text; if (string.IsNullOrEmpty(tb1)) { tb1 = "0000"; } var s1 = tb1.
689 0
常用进制转换
原文:常用进制转换       最近的工作中,需要接触到一些硬件设备,处理这些设备的通讯,因此需要进行一些进制的转换。      其实,二进制、十六进制这些基本的知识,在我们刚学编程的时候,基础课应该已经讲过的了。
678 0
C语言OJ项目参考(1942)进制转换
1942: 进制转换 Description 输入一个十进制数N,将它转换成R进制数输出。 Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。 Outputt 为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等
978 0
将一个十六进制字符串转换为十进制数值的问题
在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:char *ptr="0x11";int n=0;//我们想让n等于0x11,即17 通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:   char *ptr="123";       int n=0;...
937 0
C语言OJ项目参考(2747) 进制转换
2747: 进制转换(十进制转二进制) Description 输入一个非负整数(十进制),输出此整数对应的二进制数 Input 正整数(十进制) Outputt 对应的二进制数 Sample Input 6 Sample Outputt 110 参考解答: #include<stdio.h> void binary(int n); i
729 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7366 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载