【汇编】处理字符问题

news2024/11/18 13:51:40

文章目录

  • 前言
  • 一、处理字符问题
    • 1.1 汇编语言如何处理字符
    • 1.2 ascii
      • ascii码是什么?
      • ascii码表是什么?
    • 1.3 汇编语言字符示例代码
  • 二、大小写转换
    • 2.1 问题:对datasg中的字符串
    • 2.2 逻辑与和逻辑或
    • 2.3 程序:解决大小写转换的问题
      • 一个新的汇编指令inc指令
      • 程序
  • 总结


前言

在计算机编程的世界中,处理字符是一项常见而又关键的任务。字符处理不仅仅是涉及到文本的大小写转换,还包括了字符的过滤、编码的转换以及其他一系列操作。在底层编程语言中,如汇编语言,我们能够直接操纵内存中的字符数据,通过一系列的指令来实现各种字符处理任务。

本文将深入探讨一个8086汇编程序,通过该程序我们将学习如何处理字符串中的字符。具体而言,我们将看到如何将字符串中的小写字母转换为大写,并将大写字母转换为小写。通过这个例子,我们将理解如何使用汇编语言中的一些基本指令来完成字符级别的操作,以及如何利用寄存器和循环结构来实现这些操作。


一、处理字符问题

1.1 汇编语言如何处理字符

汇编程序中,用 ‘……’ 的方式指明数据是以字符的形式给出的,编译器将
把它们转化为相对应的ASCII码。

1.2 ascii

ascii码是什么?

ASCII(American Standard Code for Information Interchange)码是一种用于将文本字符和控制字符编码成数字的标准系统。简而言之,它是一种将文字转换为计算机可以理解的二进制形式的方法。

ascii码表是什么?

ASCII 码表包含了一系列的字符,包括字母、数字、标点符号和一些控制字符(比如换行和回车),共计128个。每个字符都用一个唯一的7位二进制数表示,因此 ASCII 码表是一个将字符与二进制数对应的表格。
例如,字母 “A” 在 ASCII 码表中对应的二进制值是 01000001。数字 “1” 对应的是 00110001。通过这种方式,计算机可以使用二进制数字来表示和处理文本,而不仅仅是数字和符号。
ASCII 码表的设计旨在实现文本的标准化表示,使得不同计算机和设备之间可以更容易地交换文本信息。虽然 ASCII 码表只包含了128个字符,但它奠定了字符编码的基础,后续的编码系统如 Unicode 扩展了这个范围,以支持更多的字符。

1.3 汇编语言字符示例代码

assume cs:codesg,ds:data
codesg segment

data segment
  db 'BaSic'
  db 'iNfOrMaTiOn'
data ends

start:  
      mov al ,'a'
      mov bl,'b'

        mov ax,4c00h
        int 21h

codesg ends
end start

这段汇编代码是一个简单的8086汇编程序,用于将字符串 “BaSic” 和 “iNfOrMaTiOn” 存储在数据段中,然后将 ‘a’ 和 ‘b’ 存储在寄存器 AL 和 BL 中。最后,程序使用 DOS 调用结束程序的执行。
现在逐步解释每一部分:

1.Segment Definitions:

codesg segment

这定义了一个代码段,称为 codesg 段。
data segment
db ‘BaSic’
db ‘iNfOrMaTiOn’
data ends

这定义了一个数据段,称为 data 段,其中包含两个字符串 “BaSic” 和 “iNfOrMaTiOn”。

2.Data Initialization:

mov al, ‘a’
mov bl, ‘b’

这两行将字母 ‘a’ 放入 AL 寄存器,将字母 ‘b’ 放入 BL 寄存器。

3.DOS Interrupt Call:

mov ax, 4c00h
int 21h

这两行用于进行 DOS 中断调用。AX 寄存器被设置为 4C00H,这是 DOS 中断 21H 的一种调用方式,它表示程序要求终止执行。这将导致程序退出并返回到 DOS 操作系统。

4.Segment End and Program End:

codesg ends
end start

这标志着代码段的结束和程序的结束。
综合起来,这个程序的主要目的是在数据段中存储两个字符串,然后将 ‘a’ 和 ‘b’ 存储在寄存器中,最后通过 DOS 中断调用结束程序的执行。实际上,这个程序没有输出任何信息到屏幕上,仅仅是一个简单的示例程序。

用DOSBox编译,链接,debug运行他
在这里插入图片描述
可以看到mov al,'a’变成了mov al,61,a就变成了ascii的十进制了

二、大小写转换

观察下面这个图片
在这里插入图片描述
可以发现,大写和小写仅仅差20H

2.1 问题:对datasg中的字符串

第一个字符串:小写字母转换为大写字母
第二个字符串:大写字母转换为小写字母

对第一个字符串,
若字母是小写,转大写;
否则,不变

对第二个字符串,
若字母是大写,转小写;
否则,不变

如果这样,是不是要用分支结构了呢?
在这里插入图片描述

我们可以使用逻辑与和逻辑或运算

2.2 逻辑与和逻辑或

在这里插入图片描述
逻辑与指令:and dest, src

在这里插入图片描述
逻辑或指令:or dest, src

2.3 程序:解决大小写转换的问题

一个新的汇编指令inc指令

当涉及到汇编语言中的 INC 指令时,可以将其想象成是一个增加器。它的作用就像是一个计数器一样,把某个东西的值加一。
比方说,你有一个盒子里放着一堆苹果,然后你想数数盒子里到底有多少个苹果。每当你数到一个苹果时,你会在一个纸上记录下来,然后继续数下一个。INC 就像是你在数苹果的时候,每数一个,记录上面的数字加一一样。
在汇编语言中,INC 指令用于将某个特定的数值增加一。无论是一个存储在寄存器里的数值还是存在内存中的数据,INC 都能将其加一。就像是对盒子里的苹果进行计数一样,只是在计算机中,这个计数是以二进制数字的形式进行的。

如果你学过C/C++这些语言,你可以理解成变量++/变量+=1

程序

assume cs:codesg,ds:data
codesg segment

data segment
  db 'BaSic'
  db 'iNfOrMaTiOn'
data ends

start:  
      mov ax,datasg
      mov ds,ax

      mov bx,0
      mov cx,5
      s: mov al,[bx]
      and al,11011111b
      mov [bx],al
      inc bx
      loop s

      mov bx,5
      mov cx,11
      s0: mov al,[bx]
      or al,00100000b
      mov [bx],al
      inc bx
      loop s0

        mov ax,4c00h
        int 21h

codesg ends
end start

这段汇编代码是一个8086汇编程序,它处理两个字符串并做了一些修改。下面是逐步的解释:

1.Segment Definitions:

codesg segment

定义了一个代码段,称为 codesg 段。
data segment
db ‘BaSic’
db ‘iNfOrMaTiOn’
data ends

定义了一个数据段,称为 data 段,其中包含两个字符串 “BaSic” 和 “iNfOrMaTiOn”。

2.Data Initialization:

mov ax, datasg
mov ds, ax

这两行将数据段 datasg 的地址加载到 DS 寄存器,以便程序可以访问数据段的内容。
mov bx, 0
mov cx, 5

初始化寄存器 BX 为0,CX 为5。这将用于处理第一个字符串 “BaSic”。

3.String Processing (s):

s: mov al, [bx]
and al, 11011111b
mov [bx], al
inc bx
loop s

这一部分是对第一个字符串的处理。通过逐个处理字符串中的字符,将每个字符的第五位(从右边数起)设置为0,实现了将小写字母转换为大写。

4.String Processing (s0):

mov bx, 5
mov cx, 11
s0: mov al, [bx]
or al, 00100000b
mov [bx], al
inc bx
loop s0

这一部分是对第二个字符串的处理。同样,通过逐个处理字符串中的字符,将每个字符的第五位设置为1,实现了将大写字母转换为小写。

5.DOS Interrupt Call:

mov ax, 4c00h
int 21h

最后,这两行是进行 DOS 中断调用,用于结束程序的执行。
总体来说,这个程序的主要目的是处理两个字符串,将第一个字符串中的小写字母转换为大写,将第二个字符串中的大写字母转换为小写。然后,程序通过 DOS 中断调用结束执行。


总结

在本文中,我们深入研究了一个汇编程序,旨在展示如何处理字符串中的字符。通过对两个字符串的处理,我们学到了如何使用位运算指令,如 AND 和 OR,来修改字符的特定位。这使得我们能够在字符的二进制表示中进行精确的位操作,实现大小写字母的转换。

此外,我们看到了如何使用寄存器来迭代访问字符串中的字符,以及如何使用循环结构来简化重复的操作。这些是汇编语言中非常重要的概念,因为它们使我们能够以底层的方式直接操作计算机的内存。

通过这个例子,我们不仅仅学到了字符处理的具体技术,还对汇编语言的基本思想有了更深刻的理解。字符处理是计算机编程中一个基础而又必要的技能,而汇编语言为我们提供了直接而强大的工具,用于在底层级别精细控制字符数据。这使得我们能够更好地理解计算机底层的运行原理,并在需要时能够编写高效的字符处理程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1226327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我终于体会到了:代码竟然不可以运行,为什么呢?代码竟然可以运行,为什么呢?

废话不多说,直接上图 初看只当是段子,再看已是段中人 事情经过: 我在写动态顺序表的尾插函数时,写出了如下代码,可以跑,但是这段代码有一个bug暂时先不提 //动态顺序表的尾插 void SLPushBack(SL* psl, …

python中列表的基础解释

列表: 一种可以存放多种类型数据的数据结构 列表的创建: 1.用【】创建列表 #创建一个空列表 list1[] #创建一个非空列表 list2 [zhang,li,ying,1,2,3] #输出内容及类型 print(list1,type(list1)) print(list2,type(list2))结果: 2.使用list…

详细步骤记录:持续集成Jenkins自动化部署一个Maven项目

Jenkins自动化部署 提示:本教程基于CentOS Linux 7系统下进行 Jenkins的安装 1. 下载安装jdk11 官网下载地址:https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html 本文档教程选择的是jdk-11.0.20_linux-x64_bin.tar.g…

Linux中系统时间同步

在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间&#x…

开发知识点-uniapp微信小程序-开发指南

uniapp uni.chooseLocationgetCurrentPages美团外卖微信小程序开发uniapp-美团外卖微信小程序开发P1 成果展示P2外卖小程序后端,学习给小程序写http接口P3 主界面配置P4 首页组件拆分P13 外卖列表布局筛选组件商家 布局测试数据创建样式 请求商家外卖数据封装请求并…

汇编-指针

一个变量如果包含的是另一个变量的地址, 则该变量就称为指针(pointer) 。指针是操作数组和数据结构的极好工具,因为它包含的地址在运行时是可以修改的。 .data arrayB byte 10h, 20h, 30h, 40h ptrB dword arrayB ptrB1 dword OFFSET arrayBarray…

4.6每日一题(多元函数的隐函数求导)

三元方程确定的二元函数类型的隐函数 方法一:两边对x求偏导,把y看成常数 注:z可以把x和y同时代入求出答案 方法二:带公式

数据结构【DS】栈

共享栈 共享栈的目的是什么? 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为? 存取数据时间复杂度为O(1) 共享栈如何判空?如何判满? 两个栈的栈顶指针都指向栈顶元素,𝑡𝑜𝑝…

【0基础学Java第十课】-- 认识String类

10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…

Java 11及更高版本的Oracle JDK版本

2021 年 9 月 14 日,Oracle 发布了可以长期支持的 JDK17 版本,那么从 JDK11 到 JDK17,到底带来了哪些特性呢?亚毫秒级的 ZGC 效果到底怎么样呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带…

PHP字符串函数的解析

在PHP中,字符串是一种常见的数据类型,用于存储和操作文本数据。PHP提供了丰富的字符串函数,用于执行各种字符串操作,包括截取、连接、替换、搜索等。在这篇文章中,我们将深入解析一些常用的PHP字符串函数,以…

小程序开通电子发票

总目录 文章目录 总目录前言结语 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 首先登录商户号:https://pay.weixin.qq.com/index.php/core/home/lo…

数据结构及八种常用数据结构简介

data-structure 数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。 常用的数据结构有 数组(array)、栈&…

debian10 开启rdp安装firefox,firefox 中文乱码

debian10 开启rdp安装firefox apt -y install tigervnc-standalone-server apt -y install xrdp tigervnc-standalone-server systemctl enable xrdpapt install firefox-esrmstsc连接 firefox-settings-general-fonts-advanced-Simplified Chinese

【LeetCode:2342. 数位和相等数对的最大和 | HashMap + 模拟 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【开源】基于Vue和SpringBoot的微信小程序的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

R语言的入门学习

目录 准备工作导入csv数据集选择前200行作为数据集展示数据集的前/后几N行宏观分析删除缺失值构建直方图导出为图片 R语言常见图像类型例1:散点图例2:散点矩阵图 准备工作 安装教程: R语言和RStudio的下载安装(非常简便舒适&…

脚本(JavaScript)-练手-简单的随机音乐播放器

浅浅的写个简单的随机音乐播放脚本(可移动),注释很详细,直接上源码 效果: // UserScript // name 播放音乐脚本 // namespace 代码对我眨眼睛 // version 1.2 // description 在API上请求音乐链接并随机自动连续播放音乐&…