汇编语言[王爽]-07 更灵活的定位内存地址的方法【大小写转换方法及应用方式】
以字符(串)的形式给出数据
assume cs:code
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start:
mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
data段在code段前面,且不足16bit,会被对齐为16bit,CS-1 就是data段的段地址
大小写转换的问题
ASCII先排大写,后排小写
大写字母+20H = 小写字母
小写字母-20H = 大写字母
小写转大写:直接 与上 1101 1111B
大写转小写:直接 并上 0010 0000B
用[bx+idata]:数组的处理
C语言:a[i] b[i]
汇编语言: 0[bx] 5[bx]
上面的例子可以写为
可以作为索引的寄存器:
- bx
- si
- di
- bp【一般用作堆栈寻址】
例子:用si di实现将字符串 welcome to masm!
复制到它后面的数据区中
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start:
mov si,0
mov di,10h
mov ax,data
mov ds,ax
mov cx,8
s:
mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
code ends
end start
当然可以用 idata[bx] 的形式替换
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
s:
mov ax,[bx]
mov 10h[bx],ax
add bx,2
loop s
[bx+si]和[bx+di]
相当于把 idata 替换为si和di,此时一般不表示数组,而是表示以bx为基址,si和di为变址
[bx+si+idata]和[bx+di+idata]
等价形式:
一般可用作表示二维数组:idata[bx][si]
例子:
总结与综合案例
例一:[bx+idata]
数据可看做一张表
mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s:
mov al,[bx+3]
and [bx+3],11011111b
add bx,16
loop s
例二:[bx+si]/[bx+di]
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0:
push cx
mov si,0
mov cx,3
s:
mov al,[bx+si]
and [bx+si],11011111b
inc si
loop s
pop cx
add bx,16
loop s0
涉及的知识点:
- 灵活的寻址方式
- 二重循环的写法
- 栈用来数据暂存
- 大小写转换
例三:[bx+idata+si]
将data段中的每个单词的前四个字母改为大写m
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0:
push cx
mov cx,4
mov si,0
s:
mov al,[bx+3+si]
and [bx+3+si],11011111b
inc si
loop s
pop cx
add bx,16
loop s0