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
补充:软件开发 , 其他 ,