【汇编】处理字符问题

文章目录

  • 前言
  • 一、处理字符问题
    • 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,来修改字符的特定位。这使得我们能够在字符的二进制表示中进行精确的位操作,实现大小写字母的转换。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「项目阅读系列」go-gin-example star 6.5k!(1)

文章目录 准备工作适宜人群项目信息 项目结构代码阅读主要模块代码主函数模块router 路由模块auth 授权模块数据库 修改文章请求分析其他依赖 总结 准备工作 适宜人群 初学 go 语法,希望了解 go 项目的构建过程和方式。 项目信息 go-gin-example 项目是使用 gin…

qt-C++笔记之两个窗口ui的交互

qt-C笔记之两个窗口ui的交互 code review! 文章目录 qt-C笔记之两个窗口ui的交互0.运行1.文件结构2.先创建widget项目,搞一个窗口ui出来3.项目添加第二个widget窗口出来4.补充代码4.1.qt_widget_interaction.pro4.2.main.cpp4.3.widget.h4.4.widget.cpp4.5.second…

JAVA for 循环训练 Pattern

import java.util.Scanner;public class Pattern {public static void main(String[] args) {int[] arr {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0};Scanner in new Scanner(System.in);System.out.print("请输入n:");int n in.nextInt();in.close();for …

LeetCode27.移除元素(暴力法、快慢指针法)

每日一题:LeetCode27.移除元素 1.问题描述2.解题思路3.代码 1.问题描述 问题描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必…

Linux(Ubuntu)安装JDK环境

系统环境 Ubuntu20.04 下载JDK压缩包 前往Oracle官网进行后续下载或单击下载JDK压缩包 下拉找到JDK8,在Linux板块下选择适配系统架构的压缩包文件(后缀为tar.gz),系统架构可通过uname -m命令查看 安装JDK 安装环境通常放在/usr/local下,进入…

免费稳定几乎无门槛,我的ChartGPT助手免费分享给你

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 ChatGPT想必大家应该都不陌生了,大部分人或多或少都接触了,好多应该都是通过openAi的官方进行使用的,这个门槛对大部分人有点高,…

公共字段自动填充-@TableField的fill实现(2)

TheadLocal 客户端发送的每次http请求,在服务端都会分配新的线程。因此登录检查过滤器、controller、元数据对象处理器属于一个线程。 TheadLocal是线程的局部变量: TheadLocal常用方法: 如何在元数据对象处理器中获取当前登录用户的id&…

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

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

酷柚易汛ERP - 序列号盘点操作指南

1、应用场景 将系统中开启序列号的商品数量与与实际存放的数量进行对比。 2、主要操作 2.1 录入序列号 打开【盘点】-【序列号盘点】,新增序列号盘点单,点击【SN】按钮,在弹框中输入序列号。 支持扫描枪录入序列号支持复制粘贴序列号录入…

JS特效:跟随鼠标移动的小飞机

前端网页中&#xff0c;用JS实现鼠标移动时&#xff0c;页面中的小飞机向着鼠标移动。 效果 源码 <!DOCTYPE html> <html><head><style>*{margin: 0;padding: 0;}body{height: 100vh;background: linear-gradient(200deg,#005bea,#00c6fb);}#plane{…

【WiFI问题自助】解决WiFi能连上但是没有网的问题

WiFi能连上但是没有网的问题 背景&#xff1a;wifi能连上&#xff0c;但是没有网 解决 遇事不决&#xff0c;先重启啊&#xff01;怎么重启&#xff1f;拔掉电源再插上&#xff01;拔掉网线再插上&#xff01; 直接ok了。 思考记录 今天WiFi又上不了网了&#xff0c;昨天报…

大数据Doris(二十六):数据导入(Routine Load)介绍

文章目录 数据导入(Routine Load)介绍 一、​​​​​​​适用场景

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

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

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

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

关于卓越服务的调研报告

NetSuite知识会发起的本次调研从2023年11月2日开始&#xff0c;到11月12日结束。16日已向参与调研的朋友邮件回复&#xff0c;感谢您的付出&#xff01;今朝分享此报告&#xff0c;各位同学参考。 调研问题与反馈总结 问题1&#xff1a;您能想到哪些服务组织能够提供高满意度&…

[CUDA]去除Eigen库中的warning

一、问题提出 假如使用nvcc对cuda代码进行编译时&#xff0c;如果代码中使用了Eigen库&#xff08;头文件&#xff09;&#xff0c;编译时可能会显示很多warning information&#xff0c;如下图红框中所示&#xff1a; 这些warning信息虽然不会影响代码的实际运行&#xff0c;…

linux如何使用Xshell远程连接

目录 1、创建虚拟机&#xff1a; 2、使用命令查看网段信息 拓展1&#xff1a;&#xff08;若网卡上没有网段信息&#xff0c;可以使用任意两种方法&#xff09;&#xff1a; 准备工作&#xff1a; 1、点击左上角的编辑后再点击虚拟网络编辑器。 2、打开以后&#xff0c…

C++__string

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、string是什么&#xff1f; 二、string的构造函数 1.string&#xff08;&#xff09;&#xff1b; 2.string&#xff08;const char * s&#xff09;&…

PHP常用的数组函数

PHP是一种流行的服务器端脚本语言&#xff0c;广泛用于Web开发。数组是PHP中最重要且最常用的数据类型之一&#xff0c;它提供了许多强大的数组函数&#xff0c;用于在数组上执行各种操作。在本文中&#xff0c;我们将深入解析PHP中一些常用的数组函数&#xff0c;以便更好地理…