汇编语言学习笔记(七)更灵活的定位内存地址的方法

来源:互联网 发布:学英语发音软件 编辑:程序博客网 时间:2024/04/28 07:09

1.and or 指令
and逻辑与:同真为真
可以将操作对象的某一位设置为0 :
比如第六位:则and al,10111111B

or或运算:同假为假
可以将操作对象的某一位设置为1 :
比如第六位:则and al,01000000B

ASCII码中大小写转换:相差32为2的5次方。字节位置在第5位不同
可以利用上面的运算可以轻松的转换大小写

2.[bx+idata]:对偏移地址进行偏移操作
[bx+idata]=[idata+bx]=idata[bx]=[bx].idata

用[bx+idata]的方式进行数组的处理
可以用[0+bx]和[5+bx]的方式在同一个循环中定位两个字符串的第一个字符
处理数组:
c语言定位方式:a[i]
汇编语言定位方式:0[bx]

3.SI和DI
SI和DI和bx功能相近,只是不能分成两个8位寄存器来使用
也可以使用[si/di+idata]

常用ds:si指向复制的原始字符串
常用ds:di指向复制的目的空间
每次复制两个字节,因为si和di不能拆成两个字节
更灵活的方式:
[bx+si]和[bx+di]
偏移地址:(bx)+(si)
mov ax,[bx+si] = mov ax,[bx][si]
(ax)=((ds)*16+(bx)+(si))

[bx+si+idata]和[bx+di+idata]
双层循环:
start:    mov cx,4
s0:    mov si,0
    mov cx,3
s:    add al,110111111b

    loop:s
    add ah,001000000b
    loop:s0

    mov ax,4c00h
    int 21h
双层循环时,内部的指数器覆盖了外层循环,会导致内存结束后,外层编程FFFF

需要每次先保存外层循环
s0:mov dx,cx
s:...
mov cx,dx
loop s0

但是寄存器又很可能被用到,所以需要定义个dw来保存cx的值
data segment
dw 0
data ends

s0:ds:[40H],cx
s:
...
loop s
mov cs,ds:[40H]
loop s0

但是有很麻烦,可以采用vc栈的做法(这个非常重要)
定义栈空间:
stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg segment
s0:push cx
...
s:
...
loop s
pop cx
loop s0



0 0
原创粉丝点击