第7章 实验6解析
(1).编程,完成问题7.9中的程序。
 问题7.9
 编程,将datasg段中每个单词的前4个字母改为大写字母。
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment  ;开辟了栈段空间,容量为16个字节
	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  ;将栈的段地址放入AX寄存器中
  	  mov ss,ax       ;将AX寄存器中的内容放入SS段寄存器中,即栈的段地址
	  mov sp,16       ;设置栈顶指针
	  mov ax,datasg   ;将数据的段地址放入AX寄存器中
	  mov ds,ax       ;将AX寄存器中的内容放入DS中,即数据的段地址
	  mov bx,0        ;将0送入BX寄存器中
	
	  mov cx,4        ;一共有4个单词,所以外层循环四次
   s0:push cx         ;将CX中的值入栈保存
      mov si,0        ;将0送入SI寄存器中,以便后续寻址使用
	  mov cx,4        ;每个单词中又要修改四个字母,所以内层循环四次
	
    s:mov al,[bx+si+3]  ;将内存单元DS:bx+si+3中的数据送入AL中
      and al,11011111b  ;改成大写字母
	  mov [bx+si+3],al  ;修改原来的数据
	  inc si            ;si+1指向下一个数据
	  loop s
	
	  add bx,16         ;bx+16指向下一个单词
	  pop cx            ;出栈原来保存的CS中的值
	  loop s0
	  
      mov ax,4c00h
      int 21h
codesg ends
end start
将上述程序在DOS中运行后,可使用D命令查看内存单元中的数据如下:
 程序未执行前内存单元中的数据如下
  程序执行后内存单元中的数据如下
程序执行后内存单元中的数据如下
 
 可看到前四个字母修改成了大写








![[MRCTF2020]Transform1](https://img-blog.csdnimg.cn/direct/5bbd79eac25a46d4aa98d8b6f39d0b1b.png)









