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

本章需掌握:

  • 寻址方式的意义和应用。
  • 二重循环的处理
  • 栈的应用
  • 大小写的转化
  • and,or指令

  1. 编程,将datasg段中的每个单词的头一个字母改写成大写字母。([bx+idata])
assume cs:code,ds:data

data segment        //注意 每个字符串都是16位
	db '1. file         '
	db '2. edit         '
	db '3. search       '
	db '4. view         '
	db '5. options      '
	db '6. help         '
data ends

code segment
start:mov ax,data
	mov ds,ax
	mov bx,0
	mov cx,6

s: 	mov al,ds:[bx+3]
	and al,11011111B
	mov ds:[bx+3],al
	add bx,16
	loop s

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

注:大写字母ASCII码的第五位为0。小写字母的第五位为1。
将第五位强行置零或者置一,从而改变大小写。

  1. 编程,将datasg段中的每一个单词改为大写字母。
assume cs:code,ds:data

data segment
db 'ibm             '    
db 'dec             '
db 'dos             '
db 'vax             '
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov bx,0
    mov cx,4

s0: mov dx,cx
    mov si,0
    mov cx,3

s:  mov al,ds:[bx+si]
    and al,11011111B
    mov ds:[bx+si],al
    inc si
    loop s 
    
    add bx,16
    mov cx,dx
    loop s0

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

注:上面代码,为了防止cx被覆盖,用dx临时保存了cx。
但是当有多层循环的时候,用多个寄存器来保存cx明显不现实。所以可以将其暂存在内存中的某个位置。但是更通常的做法,是将cx压入栈中,进行保存。具体代码和上述类似,略。

  1. 编程,将datasg段中的每一个单词的前4个字母改写成大写字母。
assume cs:code,ds:data,ss:stack

stack segment
    dw 0,0,0,0,0,0,0,0
stack ends

data segment
    db '1. display      '
    db '2. brows        '
    db '3. replace      '
    db '4. modify       '
data ends

code segment

start:
    mov ax,stack
    mov ss,ax
    mov sp,16
    mov ax,data
    mov ds,ax

    mov bx,0
    mov cx,4
s0:
    push cx
    mov si,3
    mov cx,4
s:
    mov al,ds:[bx+si]
    and al,11011111B
    mov ds:[bx+si],al
    inc si
    loop s
    pop cx
    add bx,16
    loop s0

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

总结:

  • [idata]用一个常量表示地址,可用于直接定位一个内存单元

  • [bx]用一个变量来保存内存地址,可用于间接定位一个内存单元

  • [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间隔定位一个内存单元

  • [bx+si]用两个变量表示地址

  • [bx+si+idata]用两个变量和一个常量表示地址

参考文章:
https://blog.csdn.net/u013018721/article/details/51232405
https://www.cnblogs.com/superzhao/p/4636489.html

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/89002764