汇编第七节-更灵活的定位内存地址的方法

本文介绍了8086汇编语言中灵活定位内存地址的方法,包括使用and和or指令进行位操作,通过BX、SI和DI寄存器及其组合进行高效寻址,以及利用这些技术实现字符串处理和大小写转换等实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

第七节更灵活的定位内存地址的方法

**

1.and和or指令:

And指令:逻辑与指令,按位进行与操作

Mov al,01100011B
And al,00111011B

执行后:al=00100011B
Or指令:逻辑或指令,按位进行或运算
mov al,01100011B
or al,00111011B
执行后:al=01111011B

2.以字符形式给出的数据

assume cs:code,ds:data
data segment
    db 'unIX'        ;"db 75H,6EH,49H,58H"
    db 'foRK'
data ends
code segment
start:mov al,'a'    ; "mov al,61H" a的ASCII码为61H
      mov bl,'b'
      mov ax,4c00h
      int 21h
code ends
end start     

3.大小写转换的问题:

将datasg中的第一个字符串转化位大写,第二个字符串转化为小写。

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]       ;将ASCII码从ds:bx所指向的单元中取出。
        and al,11011111B   ;第五个位置变为0,成为大写。
        mov [bx],al
        inc bx
        loop s

        mov bx,5
        mov cx,11
    s0: mov al,[bx]
        or  al,00100000B
        mov [bx],al
        inc bx
        loop s0

        mov ax,4c00h
        int 21h
codesg ends
end start       

4.[bx+idata]:

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
mov ax,[bx+200] 数字化描述:(ax)=((ds)*16+(bx)+200)
也可以写成:

mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200 

5.用[bx+idata]的方式进行数组的处理:

在codesg中填写代码,将datasg中定义的第一个字符串转化为大写,第二个字符串小写

assume cs:codesg,ds:datasg
datasg segment
    db  'BaSiC      '
    db  'MinIx      '
datasg ends

codesg segment
    start:
codesg ends
end start
mov ax,datasg
    mov ds,ax
    mov bx,0
    mov cx,5
s:  mov al,0[bx]
    and a1,11011111b
    mov o[bx],al
    mov al,5[bx]
    or  al,00100000b
    mov 5[bx],al
    inc bx
    loop s

6.SI和DI:

Si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。
用si和di实现将字符串”welcome to masm!”复制到它后面的数据区中

assume cs:codesg,ds:datasg
datasg segment
    db 'welcome to masm!'
    db '..............................'
datasg ends
codesg segment
  start:mov ax,datasg
        mov ds,ax
        mov si,0
        mov cx,8
    s:  mov ax,0[si]
        mov 16[si],ax
        add si,2
        loop s

        mov ax,4c00h
        int 21h
codesg ends
end start

7.[bx+si]和[bx+di]:

mov ax,[bx+si] //mov ax,[bx][si]
(ax)=((ds)*16+(bx)+(si))
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si的数值,段地址在ds中

8.[bx+si+idata]和[bx+di+idata]:

[bx+si+idata]偏移地址为(bx)+(si)+idata

mov ax,[bx+200+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200

9.不同寻址方式的灵活应用:

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     '
datasg ends

codesg segment
    start:
codesg ends
end start

将datasg中每个单词的头一个字母改为大写字母

mov ax,datasg
    mov ds,ax
    mov bx,0
    mov cx,6
s:  mov al,[bx+3]
    and al,11011111b
    mov [bx+3],al
    add bx,16
    loop s 
    db  'ibm        '
    db  'dec    '
    db  'dos        '
    db  'vax        '

将datasg(以上)的每个单词改为大写字母
在需要暂存数据的时候,我们都应该使用栈

stacksg segment         定义一个段,用来做栈段,容量为16个字节
    dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
  start:mov ax,stacksg
        mov ss,ax
        mov sp,16
        mov ax,datasg
        mov ds,ax
        mov bx,0

        mov cx,4

s0:mov push cx          将外层循环的cx值压栈
    mov si,0
    mov cx,3            内层循环次数  

s:  mov al,[bx+si]
    and al,11011111b
    mov [bx+si],al
    inc si
    loop s

    add bx,16
    pop cx              从栈顶弹出原cx,恢复cx   
    loop s0             外层循环的loop将cx减1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值