汇编语言随笔(6)-大小写转换与实验6(双重循环:需要保存cx值)

大小写转换

      规律:大写字母的ASCII值+20H=小写字母的ASCII值。在ASCII值中,大写字母第5位为0,小写字母第5位为1。所以通过and、or指令可以方便地进行大小写转换,而不需要提前判断字母的大小写。
      如:将al中的字符改为大写字母的方法:and al,11011111B
      将al中的字符改为小写字母的方法:or al,00100000B

实验6

      将datasg段中的每个单词的前4个字母改为大写字母。

	assume cs:codesg,ds:datasg,ss:stacksg
	stacksg segment
		dw 0,0,0,0,0,0,0,0
	stacksg ends
	
	datasg segment
		db '1. display           '		每个字符串的长度刚好是16字节
		db '2. brows             '
		db '3. replace           '
		db '4. modify            '
	datasg ends
	
	codesg segment
  start:mov ax,datasg
  		mov ds,ax		初始化数据段
  		mov ax,stacksg
  		mov ss,ax
  		mov sp,10h		初始化栈段
  		mov bx,0
  		mov cx,4		一共4行
  	 s: mov si,3		每一行中的第一个起始字符的下标
  		push cx			将外层的循环次数入栈
  	 	mov cx,4		每一行共计4个字符需要改动
  	 	
  	 s0:mov al,[bx+si]
  	 	and al,11011111B
  	 	mov [bx+si],al
  	 	inc si
  	 	loop s0
  	 	
  	 	pop cx			将外层的循环次数出栈
  	 	add bx,10h
  	 	loop s

		mov ax,4c00h
		int 21h
  	codesg ends
  	
  	end start
做一点小改动

      将datasg段中的每个单词改为大写字母。(提示:空格的ASCII值为20h,要用到前面讲过的条件转移指令jcx或je)

	assume cs:codesg,ds:datasg,ss:stacksg
	stacksg segment
		dw 0,0,0,0,0,0,0,0
	stacksg ends
	
	datasg segment
		db '1. display           '		每个字符串的长度刚好是16字节
		db '2. brows             '
		db '3. replace           '
		db '4. modify            '
	datasg ends
	
	codesg segment
  start:mov ax,datasg
  		mov ds,ax		初始化数据段
  		mov ax,stacksg
  		mov ss,ax
  		mov sp,10h		初始化栈段
  		mov bx,0
  		mov cx,4		一共4行
  	 s: mov si,3		每一行的第一个字符起始地址为3
  		push cx			将外层的循环次数入栈
  	 	
  	 s0:mov cl,[bx+si]	//mov al,[bx+si]
  	 	mov ch,0
  	 	sub cx,20h		//cmp al,20h	判断是否为空格字符
  	 	jcxz done		//je done	如果是的话表示本行的所有字符都已经转换过了,进入下一行
  	 	mov al,[bx+si]
  	 	and al,11011111B
  	 	mov [bx+si],al
  	 	inc si
  	 	jmp short s0
  	 	
   done:pop cx			将外层的循环次数出栈
  	 	add bx,10h
  	 	loop s

		mov ax,4c00h
		int 21h
  	codesg ends
  	
  	end start

おすすめ

転載: blog.csdn.net/Little_ant_/article/details/108204012