第七章 更靈活的定位內存地址的方法
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