更灵活定位内存地址2

122 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 7.7 SI和DI

  image.png

问题7.2

image.png

assume cs:code,ds:data
data segment
	db 'welcome to masm!'
	db '................'
data ends
code segment
start:	mov ax,data
		mov ds,ax
		mov si,0
		mov cx,10h
	s:	mov ax,[si]
		mov [16+si],ax
		add si,2
		loop s 
		
		mov ax,4c00h
		int 21h
	
code ends
end start

更灵活的方式:

[bx+di]

[bx+si]

image.png  

 

 

image.png  

问题7.4

image.png

  image.png

 

7.9[bx+si+idata]和[bx+di+idata]

image.png  

image.png  

 

问题7.5

image.png

image.png  

7.10不同的寻址方式的灵活应用

image.png ATTENTION:

常量表示地址时记得加上段地址

变量表示地址段地址默认为ds

 

[bx+si+idata]更加灵活,更加结构化的角度来看待所要处理的数据

问题7.6

image.png  

assume cs:code,ds:data
data segment
	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,[bx+3]
		and al,11101111b
		mov [bx+3],al
		add bx,10h
		loop s
		
		mov ax,4c00h
		int 21h
		
code ends
end start


		

 

问题7.7(代码存在bug)存疑?

image.png

assume cs:code,ds:data,ss:stack
data segment
	db 'ibm             '
	db 'dec             '
	db 'dos             '
	db 'vax             '
data ends
stack segment
	dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:	mov ax,data
		mov ds,ax
		mov ax,stack
		mov ss,ax
		mov sp,16
		mov bx,0
		
		mov cx,3
		
	s:	push cx
		mov si,0
		mov cx,4
		
	s1:	mov al,[si+bx]
		and al,11011111b
		mov [si+bx],al
		add si,10h
		loop s1			;此时的cx已经为零了吧
		
						;mov cx,dx		;在进行外层循环时恢复CX的值
		inc bx
		pop cx
		loop s			;CX=CX-1 再判断是否为零
		
		mov ax,4c00h
		int 21h
		
code ends
end start

 

DEBUG找bug

image.png

 

image.png -t单步执行至跳出内存循环

image.png  

发现CX越界???WHY???

image.png 先减一再检查是否为0

0-1=FFFF(补码)

 

解决方法:

应该在每次开始内存循环的时候,将外层循环的cx中的数值保存起来,在执行外层循环的loop指令前,再恢复外层循环的cx数值

寄存器dx来临时保存cx中的数值

 

用寄存器暂时存放不够安全!!

开辟一段内存空间

使用栈存放

image.png

用栈存放确实安全

问题7.9

image.png

 

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,data
		mov ds,ax
		mov ax,stack
		mov ss,ax
		mov sp,16
		mov si,0
		
		mov cx,4
	s:	push cx
		
		mov cx,4
		mov bx,3
	s1:	mov al,[si+bx]
		or al,00100000b
		mov [si+bx],al
		inc bx
		loop s1
		
		add si,10h
		pop cx
		loop s
		
		mov ax,4c00h
		int 21h


code ends
end start

 

Attention:

双重循环使用时,注意变量的赋值问题!!!

例如

image.png 此处内部循环为列变量变换

对列变量赋值放在外循环中(注意理解)

外部循环为行变量变换

对行变量赋值在代码初始化阶段(注意理解