汇编语言(王爽)第七章与实验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

    
原文地址:https://www.cnblogs.com/tsembrace/p/3266094.html