汇编语言(第四版)实验6 习题解答

(1)将课程中所有讲解过的程序上机调试,用 Debug 跟踪其执行过程,并在过程中进一步理解所讲内容。

由于该部分内容书上已经详细讲解,故不再赘述

(2)编程,完成问题 7.9 中的程序

问题7.9

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


assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
        dw 0,0,0,0,0,0,0,0
stacksg ends

datasg  segment
       db '1. display      '
       db '2. brows        '
       db '3. replace      '
       db '4. modify       '
datasg  ends

codesg  segment

start:
     ————————————————
codesg  ends

end start

datasg中的数据的存储的结构,如下图所示。

         datasg中定义了4个字符串,每个长度为16字节,因为他们是连续存放的,我们可以将这4个字符串看成一个4行16列的二维数组,按照要求,我们需要修改每个单词的前4个字母,即二维数组的每一行的3~6列。

        我们需要进行 4x4 次的二重循环,用变量列R定位行,常量3定位每行要修改的起始列,变量 C 定位相对于起始列的要修改的列。外层循环按行来进行,内层循环按列来进行。我们首先用R定位第1行,循环修改 R 行的 3+C ( 0<=C<=3)列;然后再用 R 定位到下一行,再次循环修改 R 行的 3+C ( 0<=C<=3)列.....,如此重复直到所有的数据修改完毕。处理的过程大致如下:

 我们用bx来做变量,定位每行的起始地址,用si定位要修改的列,用[bx+3+si]的方式来对目标单元进行寻址。

具体汇编代码如下:


assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
        dw 0,0,0,0,0,0,0,0
stacksg ends

datasg  segment
       db '1. display      '
       db '2. brows        '
       db '3. replace      '
       db '4. modify       '
datasg  ends

codesg  segment

start:
      mov ax,stacksg    ;确定栈段地址
      mov ss,ax
      mov sp,16
      mov ax,datasg     ;确定数据段地址
      mov ds,ax
      mov bx,0
      mov cx,4          ;确定外循环次数

s0:
      push cx           ;外循环次数入栈,供内循环使用
      mov  si,0
      mov  cx,4

s1:
      mov al,[bx+si+3]  ;将每行的前四个字母(每个字母占8位)放入寄存器中进行与操作
      and al,11011111b
      mov [bx+si+3],al
      inc si
      loop s1
      
      add bx,16         ;将当前位置换到下一行上(一行字符串长度占16个字节)
      pop cx
      loop s0
      
      mov ax,4c00h
      int 21h

codesg  ends

end start

实验结果:

 可以观察到,每行字符串前4个字母变为了大写。

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值