题目:


编程,将datasg段中每个单词的前4个字母改为大写字母。
给出的程序结构如下

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

stacksg segement
        dw 0,0,0,0,0,0,0,0
stacksg ends

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

codesg segement

        start:

codesg ends

end start

给出我的理解过程:
内层循环从第4个字符开始,所以我们得使用一个寄存器来存储这个起始地址[3]
外层循环次数为4,因为总计4行数据要处理

然后是程序的编写(主要是循环体的设置),这里讲书中使用栈的思想临时保存数据:
  1. 设置外层循环次数,在标号前设置:mov cx, 4
  2. 外层循环开始,将外层循环次数cx压入栈中,设置内层循环起始地址si和循环次数cx
  3. 内层循环开始,将读出的字节单元存储到al中,并使用与操作将小写换大写:
    and al, 11011111b (换大写,将倒数第三位强置0)
    or al, 00100000b (换小写)
    改变内层循环偏移量,即inc si
  4. 内层循环结束,换层次循环的起始地址(也可以说换下一行),恢复外层循环cx(出栈),进行loop s(循环判断)

  • 代码的编写

    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       ;外层循环4次
    
          s0:     push cx         ;暂存外层循环次数
                  mov si, 4       ;每行偏移4字节
                  mov cx, 4       ;内层循环4次
    
          s:      mov al, [bx+si]         ;取数据
                  and al, 11011111b
                  mov [bx+si], al
                  inc si          
                  loop s
    
                  add bx, 16      ;跳出内层循环,并换下一行
                  pop cx          ;恢复外层循环次数
                  loop s0         ;判断外层循环cx
    
                  mov ax, 4c00h
                  int 21h
    
    codesg ends
    
    end start

结果展示:

原始数据
屏幕截图 2023-03-09 123825.png

执行结束
屏幕截图 2023-03-09 124239.png