汇编程序-更灵活的定位内存地址方法
如何灵活运用定位内存的方法呢?在之后,我们将列出几个实际例子。通过例子,展示定位内存的一些方法,熟悉和提升我们对汇编程序的理解。
大小写转化(1)
通过上面的汇编程序,我们完成了将data段中存放的『basIc』转化为了『BASIC』,将『MinIX』转化为了『minix』
assume cs:codedata segmentdb 'basIc'db 'MinIX'data endscode segment start: mov ax,datamov ds,axmov bx,0mov si,0 ;表示起始位置,这里起始位置为0;观察ASCII码表,对比大小写字母的二进制形式,;发现除了第5位外,大写小字母的其他各个位数都是一样的。;大写字母的第5位为0,小写字母的第5位为1。;因此,转化大小写,只要对第5位数进行逻辑运算即可mov cx,5s: mov al,[si+bx]and al,11011111Bmov [bx],almov al,[si+5+bx]or al,00100000Bmov [5+bx],alinc bxloop smov ax,4c00Hint 21Hcode endsend start
如图:
知识点
and表示逻辑与运算。
mov al,10101100Band al,11011111B//结果 al = 10001100B
or表示逻辑或运算。
mov al,10001100Bor al,00100000B//结果 al = 10101100B
db ‘……’为以字符的形式给出数据。编辑器讲他们转化为相对应的ASCII码,一个单词为一个字节大小。
[idata+bx]
在前面,我们用[bx]的方式来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[idea+bx]表示一个内存单元,他的偏移地址为(bx)+idata(bx中的数值加上idata)。
常用格式:
mov ax,[200+bx]mov ax,200[bx]//模拟高级语言写法(类似于c语言中的a[10])mov ax,[200].bx//模拟高级语言写法
si,di寄存器
si,di是和bx功能相近的寄存器。下面展示了几种使用方法:
mov ax,[si]
/mov ax,[bi]
mov ax,[bx][si]
/mov ax,[bx][bi]
mov ax,[bx+si+10]
/mov ax,200[bx][si]
/mov ax,[bx].200[si]
/mov ax,bx[si].200
大小写转化(2)
通过下面的汇编程序,我们完成了将data段中存放的4条字符串中的小写字母转化为了大写字母
assume cs:code, ds:data, ss:stackdata segmentdb 'ibm ' db 'dec 'db 'vox 'db 'vax 'data endsstack segmentdw 0,0stack endscode segmentstart:mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axmov bx,0mov cx,4s0: push cxmov si,0mov cx,3s: mov al,[bx+si]and al,11011111Bmov [bx+si],alinc siloop sadd bx,16pop cxloop s0mov ax,4c00Hint 21Hcode endsend start code endsend start
如图:
知识点
通过栈来存放数据
例如:上面程序中进行了嵌套循环,但是技术寄存器cx只有一个。怎么做到将cx存储一分为二使用呢?我们可以通过栈来将cx中的数据存储到内存单元中。外层循环中,我们通过cx来进行循环计数;在进入内层loop之前,将外层的loop中的cx,push存放起来,再重新设置cx,进行内部loop;当内层loop完毕,通过pop将cx中的数取出来,继续外部loop中的操作。
循环嵌套
s0: push cx...s: mov al,[bx+si].........loop spop cxloop s0
大小写转化(3)
'1. display' '2. brows ''3. replace''4. modify '
将上面4个字符串中的小写单词转化为大写单词。
代码如下
assume cs:code, ds:data, ss:stackdata segmentdb '1. display' db '2. brows 'db '3. replace'db '4. modify 'data endsstack segmentdw 0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,10Hmov ax,6Hpush axmov ax,7Hpush axmov ax,5Hpush axmov ax,7Hpush axmov ax,datamov ds,axmov bx,3Hmov si,0Hmov cx,4Hs1: mov dx,cxpop cxpush dxmov si,0Hs2: mov al,[bx+si]and al,11011111Bmov [bx+si],alinc siloop s2add bx,10Hpop cxloop s1mov ax,4c00Hint 21Hcode endsend start
效果图