当前位置:软件学习 > 其它软件 >>

X86汇编学习 ----- 二

 

;将data数据段中第一个字符串转化成为大写 

;将第二个字符串转化成为小写 

;2011-9-23       YoungWei 

 

assume cs:code,ds:data 

data segment 

    db 'BaSIc' 

    db 'iNfOrMatiON' 

data ends 

 

code segment 

;处理思路:通过查看ASCII码表发现每个字母对应的大小写中,大写的ASCII值+32=小写的 

;ASCII码值。而32则刚好2…^5,有发现他们只有第6位不同。大写的第6位是0小写的为1 

;这不得不叫我们联想到二进制中的位运算。 

 

start:  mov ax,data  ;此两语句将data段与数据段关联 

        mov ds,ax 

        mov bx,0     ;作为访问数据段的索引 

        mov cx,5     ;用于循环处理根据字符串个数设定 

    S0: mov al,ds:[bx] 

        and al,11011111B 

        mov ds:[bx],al 

        inc bx 

        loop S0 

         

        mov cx,11 

    S1: mov al,ds:[bx] 

        or al,00100000B 

        mov ds:[bx],al; 

        inc bx 

        loop S1 

         

        mov ax,4c00h 

        int 21h 

code ends 

end start 

 

debug调试通过

装载程序后查看数据段内存所得结果如下

 

这里要注意DS=142e,但是为什么我看看数据而是143e:0.这是因为每个程序装载入内存后都有个段前缀(PSP),其有256Byte。大家会觉得奇怪为什么有256个字节,从142eh(DOS中默认数据是16进制的)到143eh也就10h每个单元一个字节,那也只有16字节。其实我们都知道大多计算机的多数寄存器是16位,那时怎样表示20为地址的呢?就是通过偏移,比如Ax=0200,BX=0001,那么AX:Bx=AX*16+BX=02001从而表示20位地址。所以上面多10h向左移一位100h从而有256Byte(字节)

从这张图可以看出data段中存储的数据与源程序中一样。

通过debug调试运行后该段中的数据如下

 

在这里,DS已经和data地址建立直接的关系。DS=143e.

 

从这次的编程中让我体会到了计算机世界的位的概念。特别是位运算对解决数据转换很有帮助。在这里我觉得我有必要再看下C语言中的位运算,以巩固基础。为以后编程提高效率,特别是程序的运行效率。当然程序也会变得更简洁

 

作者:VI_Young

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,