汇编_and,or

更灵活的定位方法:

and  ,  or 

用and时进行相与运算,如  :  mov al,01100011B  把二级制数01100011存入寄存器。然后  and  al,00111011B。使用  and  将al中的数和后面的数进行相于运算,得到的结果再存入al中。相于运算就是每位对齐,如果都是1,那么那一位就是1,其他情况都为0。

用 or 进行运算时,进行或运算。用法和上面一样,只是是进行或运算。只要有一个1,那么这个位就是1。只有当两个都为0时,才是0。

在汇编中,也是用ASCII码的,用单引号括起来的也表示字符,在运算时也是用其代表的ASCII码值来运算的。如,mov  al,'a'  相当于mov al,61h 

我们在汇编语言中也可以定义字符串,  db  'asda'  类似于这样,CPU会自动开辟一段内存来存放这些字符所代表的的ASCII码。

解决大小写转换的问题:

在C语言中,我们可以先根据判断一个字母为大写还是小写,然后再来对其ASCII码值进行加减运算来达到目的。但是,以我们现在的汇编水平,还不能判断字母是否为大小写,所以我们可以用另一种方法。我们先来看一下大小写字母的ASCII码对应的二进制码

我们可以发现,大写字母的第五位都是0,小写字母的第五位都是1,所以我们可以用之前的 and or  来达到我们的目的。只需要用几行简单的代码:

                              mov al,[bx]

                              and  al,11011111B

                              mov  [bx],al

其中BX存放的是我们的字符串所在的内存的偏移地址。我们再在这个代码外面增加一个循环,就可以将我们指定的字符串按我们意愿转换为大写或小写了。

我们编写一个程序来对其进行验证:

 我们照常用masm编译,;link连接

 

 然后我们用debug运行并追踪

我们可以通过观察第一条指令来找到我们存放数据的地方。

 我们可以看到数据是一样的。

然后照常执行程序

 结束循环

我们可以看到大小写变了

在访问内存单元时,对于用[.....]来表示偏移地址的方法,我们还有更灵活的用法。比如[ 23h + 10] ,那么偏移地址就是 23h+10 ,还有另外两种方式来表示这种的。比如10[23h]    [23h] . 10   意思和上面都是一样的。

还可以再加一个:[bx+200+si] , 200[bx+si] , [bx].200[si] , 200[bx][si] , [bx][si].200   方法就是把两个看成一个,然后各种和上面两个时一样的组合。   这里  si 也是一个寄存器,但是它不能当成8位来用。还有一个一样的寄存器是 di

 有时我们编程需要用到双层循环,比如:

一段连续的数据,一共有六个字节,我们需要对每个字节中的特定的一位字母进行大小写改变。这时我们可以将这六个字节的数据看成六行。那个特定字母在特定的列。所以我们要用到双层循环。外层循环是行的循环,内层是列的循环。而在循环时,我们都要用到寄存器CX,而在两个循环中CX中的值不能如我们所愿。所以我们可以在外层循环把CX中的值存入内存,在内层循环进行完后再从内存中取出来存入寄存器CX,并相应地减1。而存入内存又取出来显得很麻烦,所以这里我们可以用到栈,将CX中的值压入栈,后面再弹出来。所以要使用栈的话,我们要用 dw 开辟一段内存,可以根据我们的循环次数来设置栈的大小。这里要注意使用寄存器时CX是当成16位来用的。

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值