王爽 汇编 问题7.7,编程将datasg段中每个单词改为大写字母

一、代码实现

 1 ;目的:处理数据段中的数据,将每一行的小写字母大写
 2 ;编写:Tony
 3 ;语言:asm
 4 ;时间:2020.3.24
 5 
 6 
 7 
 8 ;定义代码段、数据段、栈段
 9 assume cs:code,ds:data,ss:stacksg
10 
11 ;数据段
12 data segment
13     db 'ibm.............'
14     db 'aoc.............'
15     db 'ios.............'
16     db 'asm.............'
17 data ends
18 
19 ;栈段
20 stacksg segment
21     dw 0,0,0,0,0,0,0,0        ;初始化8个字数据单元(不要把数据放在单引号内)
22 stacksg ends
23 
24 ;代码段
25 code segment
26 
27 start:  mov ax,stacksg         ;栈段地址送ax
28         mov ss,ax            ;ax中的数据送栈寄存器
29         mov sp,10h            ;设置栈底的位置
30         
31         mov ax,data            ;数据段地址送ax
32         mov ds,ax            ;ax中的数据送数据段寄存器
33         
34         mov bx,0            ;初始化数据段中的偏移地址
35         mov cx,4            ;初始化外层循环次数
36                 
37 s:      push cx                ;保存外层循环数据到栈中
38         mov si,0            ;初始化数据段中的偏移地址
39         mov cx,3            ;初始化内层循环次数
40 s1:     mov al,[bx+si]        ;将ds:[bx+si]中的数据送al
41         and al,11011111b    ;将al中的第5位置0,将字母大写
42         mov [bx+si],al        ;将字母大写后写回内存单元
43         inc si                ;偏移地址自增1
44         loop s1                ;循环处理将字母大写
45         
46         add bx,10h            ;修改段数据中行偏移地址
47         pop cx                ;出栈恢复cx的数据
48         loop s                ;循环处理段数据中的4段数据
49 
50         mov ax,4c00h
51         int 21h
52 code ends
53 end start

二、上机调试

0)话不多说,进入虚拟机的xp系统,打开cmd命令窗口,准备开撸……查看内存中的汇编代码

 1)在调试之前查看一下各个寄存器的数据

 2)用t指令开始单步调试代码,执行第一条指令 MOV AX,0B3C,看寄存的变化

 栈段地址0B3C送赋值给寄存器ax

3)继续执行下一条指令

 将栈段地址送栈段寄存器ss

4)在执行完mov ds,ax后,查看初始化后数据段中的数据

 5)略过……,直接来到第一次外循环处

 cx压入栈,保存cx数据到栈中

6)第一次内循环开始处

 7)第一次内循环结束处

 8)查看数据段中的数据

 可以看出第一段数据的小写字母已经大写了,嗯……成功了一小步

9)来到第二次外循环处

 最明显的就是数据段的偏移地址BX=0X0010,此时就开始准备转换第二组数据'aoc'

10)第二次内循环开始处

  11)第二次内循环结束处

  12)查看数据段中的数据

 可以看出第二段数据的小写字母已经大写了……开心啊

13)略过……直接执行完成后数据段中的数据

 嗯哼,成功啦,全部变成大写字母了……

14)程序正常结束

 15)返回cmd

原文地址:https://www.cnblogs.com/TonyJia/p/12558474.html