汇编语言(王爽)第七章与实验6
第七章 更灵活的定位内存地址的方法
7.1 and和or指令
(1)and/or指令:按位的运算符。不能对内存单元直接操作,须借助寄存器中转。
(2)and/or指令的应用:
因为不管1还是0,和1进行与运算,都能维持原数不变;与1进行或运算,都能使原数置1.
和0进行与运算,都能置0;和0进行或运算,都能维持原数不变。
可利用上述特点,进行一些应用,比如转换大小写字母。
一个字母的大写ASCII码都比小写ASCII码值小20H。比如A是41H,a是61H。
对应二进制码分别为0100 0001H,0110 0001H.
如果要将A转成a,直接用A+20H就可以。
但如果有一个字母,事先不知道其是大写还是小写,但如果要将其转成小写,该怎么处理?
显然不能用+20H的方法。注意到对于一个字母的大小写的区别还在于:0~7位上的第5位如果是1,则为小写,如果为0,则为大写。也就是说不管其第5位如何,将其转为1,并保持其他位的数值不变,都可以得到小写。
则可以通过or 原数,0010 0000B 进行转换。
同理,小写转成大写,则可以通过 and 1101 1111B进行转换。
7.5[bx+idata]的寻址形式:表示偏移地址=(bx)+idata;
这种寻址形式也可以表示为[idata+bx],idata[bx],[bx].idata
7.8[bx+si]和[bx+di]:偏移地址=(bx)+(si)/(di)
这里si和di也为16位寄存器,但他们不能分割成8位寄存器使用。
这种寻址形式也可以表示为[bx][si]/[bx][di]。
7.9[bx+si+idata]和[bx+di+idata]:表示偏移地址=(bx)+(si)/(di)+idata。
这种寻址形式也可以表示为:[bx+200+si],[200+bx+si],200[bx][si],[bx].200[si],[bx][si].200。
实验6:编程,将datasg段中每个单词的前5个字母改成大写字母。
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 ' db '2. brows ' db '3. replace ' db '4. modify ' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov si,0 mov cx,5 s0: push cx mov bx,0 mov cx,4 s1: mov al,[bx][si].3 and al,11011111B mov [bx][si].3,al add bx,10h loop s1 inc si pop cx loop s0 mov ax,4c00h int 21h codesg ends end start