微机原理实验二、编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,相同则显示“MATCH”,若不同则显示“NO MATCH”

微机原理实验二、编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,相同则显示“MATCH”,若不同则显示“NO MATCH”

实验目标:
编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,相同则显示“MATCH”,若不
同则显示“NO MATCH”

文章目录

  • 微机原理实验二、编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,相同则显示“MATCH”,若不同则显示“NO MATCH”
    • 一、 写在程序开头的段寄存器设置
    • 二、 自动进行重复比较--repz cmpsb
    • 三、 跳转指令
    • LEA 地址传送指令
    • 四、 实现的汇编代码
      • 实现程序的完整代码一(字符串是程序运行前设置的)
      • 4.2 实现程序的完整代码二(字符串是运行后由键盘输入的)

一、 写在程序开头的段寄存器设置

    MOV AX,DATAMOV DS,AXMOV ES,AX

这段代码用于设置数据段寄存器(DS)和附加段寄存器(ES)的值。在8086汇编语言中,数据段寄存器(DS)和附加段寄存器(ES)通常需要设置为相同的值,以确保程序能够正确访问数据段中的数据。这是因为在实模式下,DS和ES寄存器通常被用于存储数据段的地址。

具体来说:

  • MOV AX, DATA:将数据段的段地址加载到AX寄存器中。
  • MOV DS, AX:将AX寄存器中的数据段地址设置到DS寄存器,以便程序能够访问数据段中的数据。
  • MOV ES, AX:将AX寄存器中的数据段地址设置到ES寄存器。在本例中,ES寄存器没有被程序使用,这是一个常见的做法,因为大多数情况下,DS和ES寄存器都被设置为相同的值。

总的来说,这段代码确保了程序在实模式下正确地访问了数据段中的数据。

二、 自动进行重复比较–repz cmpsb

当使用REPZ CMPSB指令时,通常会结合使用DISI 寄存器来比较两个字符串。以下是 REPZ CMPSB 指令的一般用法和相关寄存器的作用:

  1. DI 寄存器(Destination Index):DI 寄存器通常用于存储目标字符串的地址。在 REPZ CMPSB 指令中,DI 寄存器指向第一个字符串(目标字符串)的起始位置,它会在比较过程中自动递增(如果 DF 标志位未设置)或递减(如果 DF 标志位被设置)。

  2. SI 寄存器(Source Index):SI 寄存器通常用于存储源字符串的地址。在 REPZ CMPSB 指令中,SI 寄存器指向第二个字符串(源字符串)的起始位置,它会在比较过程中自动递增(如果 DF 标志位未设置)或递减(如果 DF 标志位被设置)。

  3. CX 寄存器(Count):CX 寄存器用于存储重复执行 REPZ CMPSB 指令的次数。在 REPZ CMPSB 指令中,CX 寄存器的值决定了比较操作的重复次数。指令会反复执行直到 CX 寄存器的值减为零,或者比较操作不满足条件时停止。

  4. DF 标志位(Direction Flag):DF 标志位决定了 REPZ CMPSB 指令中地址寄存器 DI 和 SI 的自动递增或递减方向。如果 DF 标志位被设置(值为 1),地址寄存器 DI 和 SI 会递减;如果 DF 标志位未设置(值为 0),地址寄存器 DI 和 SI 会递增。在比较字符串时,通常 DF 标志位会被设置为 0,以便使地址寄存器 DI 和 SI 自动递增。

总体来说,REPZ CMPSB 指令用于比较两个字符串的内容。它会从 DI 和 SI 指向的内存位置开始逐字节地比较两个字符串,直到两个字符串中的字节不相等、其中一个字符串的结束标志(通常是空字符或换行符),或者重复比较的次数达到 CX 寄存器的值为止。比较的结果可以根据 ZF 标志位的状态来确定:如果 ZF 标志位被设置(值为 1),则表示两个字符串完全相同;如果 ZF 标志位未设置(值为 0),则表示两个字符串至少有一个字节不相同。

三、 跳转指令

当处理字符串比较时,通常需要根据比较的结果来执行不同的操作。在汇编语言中,使用条件跳转指令来实现这种根据条件执行跳转的功能。jzjnz 就是其中两个条件跳转指令,它们分别代表“跳转如果零标志位被设置”和“跳转如果零标志位未被设置”。

  1. JZ(Jump if Zero)jz 指令用于在零标志位(ZF)被设置时执行跳转。ZF 标志位表示上一条指令的运算结果是否为零。如果 ZF 被设置(值为 1),则表示上一条指令的结果为零,此时 jz 指令会跳转到指定的目标地址执行;如果 ZF 未被设置(值为 0),则 jz 指令不会跳转,而是继续执行下一条指令。

  2. JNZ(Jump if Not Zero)jnz 指令与 jz 相反,它用于在零标志位未被设置时执行跳转。如果 ZF 未被设置(值为 0),则表示上一条指令的结果不为零,此时 jnz 指令会跳转到指定的目标地址执行;如果 ZF 被设置(值为 1),则 jnz 指令不会跳转,而是继续执行下一条指令。

在字符串比较的例子中,jz match 表示如果两个字符串完全相同(ZF 被设置),则跳转到标签 match 执行相应的操作;而 jnz nomatch 表示如果两个字符串至少有一个字节不相同(ZF 未被设置),则跳转到标签 nomatch 执行相应的操作。这样可以根据比较的结果来决定程序的执行流程。

除了 jzjnz 之外,汇编语言还提供了其他条件跳转指令,用于根据不同的条件进行跳转。以下是一些常见的条件跳转指令及其含义:

  1. JA(Jump if Above):如果无符号数A大于B,则执行跳转。
  2. JAE(Jump if Above or Equal):如果无符号数A大于等于B,则执行跳转。
  3. JB(Jump if Below):如果无符号数A小于B,则执行跳转。
  4. JBE(Jump if Below or Equal):如果无符号数A小于等于B,则执行跳转。
  5. JE(Jump if Equal):如果两个数相等,则执行跳转。
  6. JNE(Jump if Not Equal):如果两个数不相等,则执行跳转。
  7. JG(Jump if Greater):如果有符号数A大于B,则执行跳转。
  8. JGE(Jump if Greater or Equal):如果有符号数A大于等于B,则执行跳转。
  9. JL(Jump if Less):如果有符号数A小于B,则执行跳转。
  10. JLE(Jump if Less or Equal):如果有符号数A小于等于B,则执行跳转。
  11. JMP:无条件地改变程序的执行流程
    这些条件跳转指令可以根据不同的比较条件来进行跳转,从而实现根据不同情况执行不同的操作。

LEA 地址传送指令

LEA 指令(Load Effective Address)是用于加载有效地址的指令,它将某个内存地址的偏移量加载到目标操作数中,而不是将内存地址中的内容加载到目标操作数中。
LEA 指令的语法格式如下:

LEA 目标操作数, 源操作数

其中,目标操作数是一个通用寄存器,用于存储源操作数的有效地址。源操作数可以是一个内存地址、寄存器或常数。

LEA 指令的主要作用是计算内存地址,将地址的偏移量加载到目标操作数中。它不会访问内存,只是执行简单的地址计算。

例如,假设有一个变量 var 存储在内存地址 0x1000 处,要将该地址的偏移量加载到 BX 寄存器中,可以使用以下 LEA 指令:

LEA BX, var

在这个示例中,LEA BX, var 指令将变量 var 的地址 0x1000 的偏移量加载到 BX 寄存器中,而不是将 var 的值加载到 BX 寄存器中。

LEA 指令常用于计算数组元素的地址、构建复杂的内存地址表达式以及进行一些与内存地址相关的操作。

四、 实现的汇编代码

实现程序的完整代码一(字符串是程序运行前设置的)

实现效果图:
在这里插入图片描述

在这里插入图片描述

;#########################################################################
; @Description:  编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,
;                  相同则显示“MATCH”,若不同则显示“NO MATCH”
;* @Version: 1.0
;* @Autor: Huining Li777
;* @运行:Please input a string: asd(回车)
;        Please input a string: asd(回车)
;        MATCH
;#########################################################################; 比较两个字符串所含的字母是否相同,若相同则显示"MATCH",不同显示"NO MATCH"DATA SEGMENT
str1 db 'Hhhhhha'
str2 db 'Hhhhhhh'
str3 db 'match',10,'$'
str4 db 'No match',10,'$' ;10是换行符,13是回车,$表示字符串结束
DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE
START:MOV AX,DATAMOV DS,AXMOV ES,AXmov cx,100;比较100次,若字符串长度大于了一百,则会比较错误lea di,str1;将字符串str1的地址送入dilea si,str2;将字符串str2的地址送入sirepz cmpsb;重复比较,就是比较每一个字符jz match;相同则转移jnz nomatch;不相同则转移
match:lea dx,str3;将提示内容送入dxmov ah,09h;输出int 21hjmp exit
nomatch:lea dx,str4;将提示内容送入dxmov ah,09h;输出int 21hjmp exitexit:;退出mov ah,4chint 21h
code ends
end start

4.2 实现程序的完整代码二(字符串是运行后由键盘输入的)

实现效果图:
在这里插入图片描述

DATA SEGMENTinput_buffer    DB 100 DUP('$')   ; 用于存储输入的字符串,假设最大长度为 100str1            DB 100 DUP('$')   ; 存储输入的字符串 str1str2            DB 100 DUP('$')   ; 存储输入的字符串 str2str3            DB 'MATCH', 10, '$' ; 匹配提示字符串str4            DB 'NO MATCH', 10, '$' ; 不匹配提示字符串prompt_input    DB 'Please input a string: $' ; 输入提示文字
DATA ENDSCODE SEGMENTASSUME DS:DATA, CS:CODE
START:MOV AX, DATAMOV DS, AXMOV ES, AX; 读取第一个字符串MOV DX, OFFSET prompt_inputMOV AH, 09HINT 21HCALL read_input1; 读取第二个字符串MOV DX, OFFSET prompt_inputMOV AH, 09HINT 21HCALL read_input2; 比较两个字符串LEA DI,OFFSET  str1LEA SI,OFFSET  str2MOV CX, 100 ; 假设最大比较次数为 100REPE CMPSBJZ matchJMP nomatch; 如果循环结束,表示两个字符串完全相等MOV DX, OFFSET str3JMP print_resultmatch:MOV DX, OFFSET str3JMP print_resultnomatch:MOV DX, OFFSET str4print_result:MOV AH, 09HINT 21H; 退出程序MOV AH, 4CHINT 21H
;------------------read1--------------------------------
read_input1 PROCMOV SI, 0
read_loop1:MOV AH, 01HINT 21HCMP AL, 0DHJE end_read1MOV input_buffer[SI], ALINC SIJMP read_loop1
end_read1:MOV CX, SIMOV SI, 0MOV DI, OFFSET str1REP MOVSBRET
read_input1 ENDP
;------------------read2----------------    
read_input2 PROCMOV SI, 0
read_loop2:MOV AH, 01HINT 21HCMP AL, 0DHJE end_read2MOV input_buffer[SI], ALINC SIJMP read_loop2
end_read2:MOV CX, SIMOV SI, 0MOV DI, OFFSET str2REP MOVSBRET
read_input2 ENDPCODE ENDS
END START

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化校园引领未来

在当今科技日新月异的时代,数字化转型已成为各行各业的必然趋势,教育领域也不例外。随着信息技术的迅猛发展,数字化已经成为推动教育变革的重要力量,它不仅重塑了传统的教育模式,还为学生、教师以及整个教育生态系统带…

什么是ISP,为什么跨境推荐ISP?

ISP,全称Internet Service Provider,即“互联网服务提供商”。它是为个人或企业提供访问、使用或参与互联网服务的组织,主要为用户提供互联网接入业务、信息业务和增值业务。ISP是经国家主管部门批准的正式运营企业,享受国家法律保…

React-hooks: useCallback

useCallback文档 https://react.docschina.org/reference/react/useCallback 是一个允许你在多次渲染中缓存函数的 React Hook。 const cachedFn useCallback(fn, dependencies)参数 fn:想要缓存的函数。此函数可以接受任何参数并且返回任何值。React将会在初次…

C语言游戏实现——贪吃蛇

思路讲解 ** 贪吃蛇游戏是要求我们要操控一条蛇,在游戏规定的空间之内,进行吃食物,吃到一个就增加蛇身的长度,并且游戏得分加1,如果吃到自己,和碰到墙就算死亡,同时可以增加蛇的速度和减慢蛇的…

VideoComposer: Compositional Video Synthesis with Motion Controllability

decompose videos into three distinct types of conditions: textual conditions, spatial conditions, temperal conditions 条件的内容: a. textual condition: coarse grained visual content and motions, 使用openclip vit-H/14的text encoder b. spatial co…

docker 虚拟化与docker的概念

一、云计算的三种服务模式 laas、pass、saas 1.1 IaaS: Infrastructure-as-a-Service(基础设施即服务) 第一层叫做IaaS,有时候也叫做Hardware-as-a-Service,几年前如果你想在办公室或者公司的网站上运行一些企业应用&#xff0c…

最大神经系统Hala Point正式亮相,AI算力新标杆诞生!

英特尔宣布推出 Hala Point 前言 就在近日,英特尔公司宣布推出了目前以来最大的神经系统Hala Point。目前看来该系统将用于支持未来的、受大脑启发的AI研究项目,解决与AI模型可持续性相关的挑战等任务上。那么Hala Point究竟有什么魅力呢?我们…

这就叫专业,安防监控领域的可视化效果走一波!

设计安防监控领域的可视化大屏时,需要考虑以下几个方面: 显示实时监控画面: 将监控摄像头的实时画面显示在大屏上,以便实时观察和监控各个区域的情况。可以使用分割屏幕的方式,同时显示多个监控画面。 报警和事件显示…

网络工程师的网络故障排除方法(非常详细)零基础入门到精通,收藏这一篇就够了

网络故障是在日常工作中经常会遇到的问题,尤其是对于那些经常需要和网络打交道的网络工程师们,对于他们而言,如何才能快速进行网络故障的排查、及时解决网络问题呢?接下来我们来讲讲网络排障的基本思路。 一、首先需要熟悉OSI七层…

接口测试和Mock学习路线(上)

一、接口测试和Mock学习路线-第一阶段: 掌握接口测试的知识体系与学习路线掌握面试常见知识点之 HTTP 协议掌握常用接口测试工具 Postman掌握常用抓包工具 Charles 与 Fiddler结合知名产品实现 mock 测试与接口测试实战练习 1.接口协议: 需要先了解 O…

msvcr120.dll文件缺失的相关修复方法分享,有一键修复msvcr120.dll的方式

关于msvcr120.dll文件缺失的缺失,其实网上已经有很多的方法了,但是有很多事不靠谱的,或者是讲得不太清楚的,所以小编觉还是有需要来给大家详细的讲解一下msvcr120.dll文件缺失的相关修复方法,好了废话不多说&#xff0…

后端工程师——Java工程师招聘要求

后端工程师隶属于软件研发工程师,是从事软件开发相关工作人员,其主要职责是 平台设计、接口设计 和 功能实现。作为后端人员,有很多的就业机会,根据你的编程语言掌握情况、个人经验和薪资追求等,可以申请 Java 开发、 PHP 开发、游戏开发人员或 Web 开发人员等职位。 在国…