《汇编语言》王爽(第四版)第七章 实验6

本文详细分析并提供了《汇编语言》实验6的解决方案,即编程将数据段中的每个单词前4个字母转换为大写。通过解析数据结构、循环计数器管理和字母大小写转换的实现,展示了汇编语言中处理字符串的技巧。代码部分展示了如何利用栈保存循环计数器,并通过位操作实现字母大小写的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

前言

一、题目

二、分析

1.从数据结构角度理解题目

2.外层循环计数器的问题 & 栈的使用

3.字母的大小写转换

三、代码

总结


前言

 王爽老师《汇编语言》(第四版)第七章 实验6 (程序7.9)分析及代码


一、题目

编程,将data段中的每个单词的前4个字母改为大写。

assume cs:code,ds:data,ss:stack
  
  data segment
    db '1. display      '
    db '2. brows        '
    db '3. replace      '
    db '4. modify       '
  data ends

  stack segment
    dw 0,0,0,0,0,0,0,0
  stack ends

  code segment
  
  start:
  
        ; ?  代码写在这里

code ends
end start

二、分析

1.从数据结构角度理解题目

为了方便,每一个单词后边都加了空格,这样每一个单词其实都占了16个字节。要修改的单词一共有四个,每个单词字符串中要修改的是第3-6(从0开始计数)个字符。这就可以理解为高级编程语言中的二维数组。很容易想到,可以通过二维数组遍历的方式来完成题目。

2.外层循环计数器的问题 & 栈的使用

但是这里有一个问题,在高级编程语言中,内外层循环可以定义不同的变量作为计数器,但是汇编语言中默认使用cx寄存器作为循环次数的计数器。

可以想到的办法是,使用另外的寄存器来暂存外层循环要使用的cx的数据。但是寄存器数量毕竟是有限的,更好的方法是,将以后还要使用的数据存储到内存中,需要用的时候再从内存中取出来。

一般来说,需要暂存数据的时候,就应该使用栈,利用push和pop指令存取数据。

3.字母的大小写转换

计算机中存储的是二进制,首先想到的方法大概是通过条件判断语句,先判断字符是大写还是小写字母,再决定是否进行转换。但是现在还没学习到判断语句,就要另想办法。

通过观察,ASCII码中每一个字母都占一个字节,也就是两个16进制位(或者是8个二进制位)。由于小写字母对应的十六进制一定是6XH或者7XH,那么它对应的二进制的高四位就应该是0110B或者0111B。而大写字母对应的十六进制一定是4XH或者5XH,那么它对应的二进制的高四位就应该是0100B或者0101B。

观察可得,如果是小写字母,那么对应的二进制的高四位一定是XX1X,而大写字母对应的二进制的高四位一定是XX0X。于是就可以利用and指令或者or指令,来完成大小写的转换。这真是很巧妙啊!

三、代码

assume cs:code,ds:data,ss:stack
  
  data segment
    db '1. display      '
    db '2. brows        '
    db '3. replace      '
    db '4. modify       '
  data ends

  stack segment
    dw 0,0,0,0,0,0,0,0
  stack ends

  code segment
  
  start:
  mov ax,data         ;设置ds
  mov ds,ax

  mov ax,stack        ;设置栈顶
  mov ss,ax
  mov sp,10H
  
  mov bx,0            ;bx作为行号索引
  mov cx,4            ;设置外层循环次数 初始值
  
  s0:                 ;外层循环:每一遍操作一行
  push cx             ;将外层循环次数压入栈
  mov si,3            ;列号索引
  mov cx,4            ;设置内循环次数
  
  s:                  ;内循环:每一遍操作一列
  mov al,[bx+si]      ;将内存中的值复制到al寄存器中
  and al,11011111B    ;把这个值变为大写字母
  mov [bx+si],al      ;完成后复制回内存
  inc si              ;列号+1
  loop s

  add bx,10H          ;行号+1,一行占10H字节
  pop cx              ;将外循环次数pop出来
  loop s0             ;loop执行时自动将外层循环的cx-1


  mov ax,4c00h
  int 21h
code ends

end start

总结

本文给出了《汇编语言》(第四版)实验6的分析与代码,并简单总结了涉及的知识点。

### 关于《汇编语言第四版实验七的内容解析 在《汇编语言第四版中,实验七主要围绕 **寄存器间接寻址** 和 **字符串处理指令** 展开[^1]。这部分内容旨在帮助读者深入理解如何通过寄存器间接访问存储单元以及掌握常用的字符串处理指令。 #### 寄存器间接寻址 寄存器间接寻址是一种重要的寻址方式,在这种模式下,操作数的有效地址由某个通用寄存器的内容给出。例如,`MOV AX, [BX]` 表示将 BX 所指向的内存单元中的数据加载到 AX 中。这种方式可以显著提高程序灵活性并减少硬编码地址的需求。 #### 字符串处理指令 实验七还涉及到了一些常见的字符串处理指令,比如 `MOVS` (移动字符串)、`STOS` (存储字符串) 等。这些指令通常配合重复缀 REP 使用来实现批量的数据复制或其他操作[^2]。下面是一个简单的例子展示如何利用 `REP MOVSB` 进行字符串拷贝: ```asm ; 假设 DS:SI 指向源字符串,ES:DI 指向目标位置,CX 是要复制的字符数量 cld ; 设置方向标志为增量模式(DF=0) rep movsb ; 复制 CX 个字节从 DS:SI 到 ES:DI ``` 此外,书中提到可以通过逻辑运算指令如 AND 或 OR 来改变特定位的状态从而完成某些特殊功能,像大小写字母转换就是典型的应用场景之一。 #### 编辑和调试技巧 为了简化直接输入复杂的十六进制序列至内存的过程,《汇编语言》介绍了 A 命令作为辅助工具的方法[^3]。它允许开发者更直观地定义初始状态下的各个部分而无需逐一手动计算每一个具体数值的位置关系。 综上所述,实验七大体涵盖了上述几个方面知识点的学习与实践机会;建议按照教材指引逐步尝试编写相应的小型项目以巩固所学理论基础。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值