王爽 《汇编语言》第7章 更灵活的定位内存地址的方法 学习笔记

目录

一、and和or指令

二、ASCII码

三、以字符形式给出的数据

四、大小写转换

五、[bx+idata]

六、用[bx+idata]的方式进行数组的处理

七、SI和DI——和bx功能相近的寄存器

八、[bx+si]和[bx+di]

九、[bx+si+idata]和[bx+di+idata]

十、不同的寻址方式的灵活运用

问题1:将每个单词的首字母改为大写字母

问题2:将每个单词改为大写字母


一、and和or指令

and为按位与运算,都是1则为1,否则为0

or为按位或运算,都是0则为0,否则为1

二、ASCII码

字符在计算机中是以编码的形式存在的,而如何编码就是一种规则,最常见的是ASCII码

如a的ASCII码为61H,b的ASCII码是62H

三、以字符形式给出的数据

用'……'的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码

如 mov al,'a'    相当于mov al,61H

四、大小写转换

已知:小写字母的ASCII码值比大写字母的ASCII码值大20H

所以要将大写转化为小写,只需将ASCII码值加上20H即可

存在的问题:转换前应判断字母是大写还是小写,但是目前还没有学判断指令(类似C语言中的if)

发现规律:就ASCII码的形式来看,除了第5位数外(位数从0开始),大小写字母的其它各位都一样,大写字母第5位为0,小写字母为1。

解决方法:用or和and

代码:

assume cs:codesg,ds:datasg

datasg segment

    db 'BaSIC'
    db 'iNfOrMaTiOn'

datasg ends

codesg segment
        
 start: mov ax,datasg
        mov ds,ax

        mov bx,0

        mov cx,5

     s: mov al,[bx]
        and al,11011111B
        mov [bx],al
        inc bx
        loop s    //这里是将BaSIC转化为大写

        mov bx,5
        
        mov cx,11

    s0: mov al,[bx]
        or al,00100000B
        mov [bx],al
        loop s0    //将iNfOrMaTiOn转化为小写

        mov ax,4c00h
        int 21h
        
codese ends

end start

五、[bx+idata]

mov ax,[bx+200]

将  段地址为cs的值,偏移地址为bx+200的内存单元的值  赋值给ax

其它格式:

mov ax,[200+bx]

mov ax,200[bx]

mov ax,[bx].200

六、用[bx+idata]的方式进行数组的处理

问题:仍是大小写的转换

代码如下:(只有核心部分)

    mov ax,datasg
    mov ds,ax
    mov bx,0

    mov cx,5
s:  mov al,[bx]
    and al,11011111b
    mov [bx],al
    mov al,[bx+5]
    or al,0010000b
    mov [bx+5],al
    inc bx
    loop s

七、SI和DI——和bx功能相近的寄存器

si和di是和bx功能相近的寄存器,区别是si和di不能分为两个8为寄存器。

例:mov si,0

        mov ax,[si]

八、[bx+si]和[bx+di]

mov ax,[bx+si]

将 段地址为cs的值,偏移地址为bx+si的内存单元中的数值 赋值给ax

九、[bx+si+idata]和[bx+di+idata]

偏移地址为bx+di+idata

mov ax,[bx+si+idata]

将 段地址为cs的值,偏移地址为bx+si+idata的内存单元中的数值 赋值给ax

例:mov ax,[bx+si+200]

将 段地址为cs的值,偏移地址为bx+si+200的内存单元中的数值 赋值给ax

其它格式:

mov ax,[bx+200+si]

mov ax,[200+bx+si]

mov ax,200[bx][si]

mov ax,[bx].200[si]

mov ax,[bx][si].200

十、不同的寻址方式的灵活运用

问题1:将每个单词的首字母改为大写字母

assume cs:codesg,ds:datasg

datasg segment

    db '1.file        '
    db '2.edit        '
    db '3.search      '
    db '4.view        '
    db '5.options     '
    db '6.help        '   //注:定义了6个字符串,每个长度为16个字节

datasg ends

codesg segment

start:  mov ax,datasg
        mov ds,ax
        mov bx,0

        mov cx,6
    s:  mov al,[bx+3]
        and al,11011111b
        mov [bx+3],al
        loop s

code ends

end start  
        

问题2:将每个单词改为大写字母

由于有双层循环,而只有一个cx,所以将外层循环的cx值存放在另一个位置。

这个位置可以是另外一个寄存器,如dx。但是当程序复杂时,由于8086CPU只有几个寄存器可用,所以要考虑其他位置,即内存空间。

故以下代码将外层循环的cx值存放在CS:[40H]的空间里。

assume cs:codesg,ds:datasg

datasg segment
       
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
    db 0

datasg ends

codesg segment

    mov ax,datasg
    mov ds,ax
    mov bx,0

    mov cx,4
 s: mov ds:[40H],cx
    mov si,0
    mov cx,3
s0: mov al,[bx+si]
    and al,11011111b
    mov [bx+si],al
    loop s0

    add bx,16
    mov cx:ds:[40H]
    loop s0

    mov ax,4c00h
    int 21h

codesg ends

end start

但是!

需要保存多个数据时,需要记住数据放到了哪个单元中,这样程序容易混乱。

----->一般在需要暂存数据的时候,我们都应该用栈。

修改后的代码如下:

assume cs:codesg,ds:datasg

datasg segment
       
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '

datasg ends

stacksg segment
    
    dw 0,0,0,0,0,0,0,0

stacksg ends

codesg segment

    mov ax,stacksg
    mov ss,ax
    mov sp,16
    mov ax,datasg
    mov ds,ax
    mov bx,0

    mov cx,4
 s: push cx
    mov si,0
    mov cx,3
s0: mov al,[bx+si]
    and al,11011111b
    mov [bx+si],al
    loop s0

    add bx,16
    pop cx
    loop s0

    mov ax,4c00h
    int 21h

codesg ends

end start

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云霄星乖乖的果冻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值