王爽 汇编 问题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
海阔凭鱼跃,天高任鸟飞,成功没有捷径,唯有努力前行!