汇编语言[王爽]-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

Untitled

Untitled

data段在code段前面,且不足16bit,会被对齐为16bit,CS-1 就是data段的段地址

大小写转换的问题

Untitled

ASCII先排大写,后排小写

大写字母+20H = 小写字母

小写字母-20H = 大写字母

小写转大写:直接 与上 1101 1111B

大写转小写:直接 并上 0010 0000B

Untitled

Untitled

用[bx+idata]:数组的处理

C语言:a[i] b[i]

汇编语言: 0[bx] 5[bx]

上面的例子可以写为

Untitled

可以作为索引的寄存器:

  • 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]

等价形式:

Untitled

一般可用作表示二维数组:idata[bx][si]

例子:

Untitled

Untitled

总结与综合案例

Untitled

例一:[bx+idata]

Untitled

数据可看做一张表

数据可看做一张表

	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]

Untitled

	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

Untitled

	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
	
posted @ 2025-09-15 16:04  Miaops  阅读(4)  评论(0)    收藏  举报