汇编语言(第三版)第七章 更灵活的定位内存地址的方法 笔记

7.1 and 和 or 指令

and 按位逻辑与,or 按位逻辑或

mov al, 	0110_0011b
and al, 	0011_1011b
;执行后 al=	0010_0011b

or	al,		0011_1011b
;执行后 al=	0111_1011b

7.2 关于ASCII码

是一种编码方案,约定了用什么信息来表示现实对象。
用61H表示’a’,用62H表示’b’.

7.3 以字符形式给出的数据

assume cs:code , ds:data
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

在这里插入图片描述

7.4 大小写转换的问题

比方‘A’的ASCII码是41H,'a’的ASCII码是61H.之间相差了20H。
通过比较发现,第五位如果是0就是大写,第五位为1就是小写。

assume cs:codesg, ds:datasg

datasg segment
	db 'BaSiC'
	db 'iNfOrMaTiOn'
datasg ends

codesg segment
start:	
	mov ax,datasg
	mov ds,ax
	
	mov bx,0
	mov cx,5
s:	mov al,[bx]
	and al,11011111b
	mov [bx],al
	inc bx
	loop s

	mov cx,11
s0:	mov al,[bx]
	or al,00100000b
	mov [bx],al
	inc bx
	loop s0

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

在这里插入图片描述

7.5 [bx+idata]

mov ax,[bx+200]	;其实就是bx偏移地址加上200
;同 mov ax, [200+bx]、mov ax, 200[bx]、mov ax,[bx].200 一样

问题 7.1

在这里插入图片描述

ax = 00beh
cx = 0600h
cx = 0606h

7.6 用[bx+idata]的方式进行数组的处理

mov ax, datasg
mov ds, ax
mov bx, 0

mov cx,5
s:mov al,0[bx]
mov 0[bx],al		;这里就是[bx+idata]
mov al,5[bx]
or al,00100000b
mov 5[bx],al
inc bx
loop s

7.7 SI 和 DI

si 和 di 在8086CPU中功能与 bx 相近。但不能将其分成两个8位寄存器使用。

问题 7.2

在这里插入图片描述

assume cs:codesg, ds:datasg
datasg segment
	db 'welcome to masm!'
	db '................'
datasg ends
codesg segment
start:	mov ax,datasg
		mov ds,ax
		mov si,0
		mov di,16
		
		mov cx,8
	s:	mov ax,[si]
		mov [di],ax
		add si,2
		add di,2
		loop s

		mov  ax,4c00
		int 21h
codesg ends
end start

问题 7.3

用更少的代码实现问题7.2中的程序

assume cs:codesg, ds:datasg
datasg segment
	db 'welcome to masm!'
	db '................'
datasg ends
codesg segment
start:	mov ax,datasg
		mov ds,ax
		mov si,0
		
		mov cx,8
	s:	mov ax,0[si]
		mov 16[si],ax
		add si,2
		loop s

		mov  ax,4c00
		int 21h
codesg ends
end start

7.8 [bx+si] 和 [bx + di]

可以用 [bx+si] 和 [bx+di],也可以使用 [bx][si]的方式。

问题 7.4

在这里插入图片描述
在这里插入图片描述

ax= 00beh bx = 1000h  cx = 0606h

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

问题 7.5

在这里插入图片描述

ax = 0006h
bx = 226ah
cx = 226ah 

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

问题7.6

在这里插入图片描述

assume cs:codesg, ds:datasg

datasg segment
	db '1. file         '
	db '2. edit         '
	db '3. search       '
	db '4. view         '
	db '5. options      '
	db '6. help         '  
datasg ends

codesg segment
start:
	mov ax,segment
	mov ds,ax
	mov bx,0
	mov cx,6
s:	mov al,[bx+3]
	and al,11011111b
	mov [bx+3], al
	add bx, 16
	loop s
	
codesg ends
end start

问题 7.7

在这里插入图片描述

assume cs:codesg, ds:datasg

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

codesg segment
start:
	mov ax,datasg
	mov ds,ax
	mov bx,0
	
	mov cx,4
s0:	mov dx,cx

	mov si,0
	mov cx,3
s:	mov al,[bx+si]
	and al,11011111b
	mov [bx+si],al
	inc si
	loop s
	
	mov cx, dx
	add bx,16
	loop s0
	
	
codesg ends
end start

问题7.8

显然内存单元可以用于暂存数据。
一般来说,在需要暂存数据的时候,我们都应该使用栈

assume cs:codesg, ds:datasg, ss:stacksg
datasg segment
	db 'ibm             '
	db 'dec             '
	db 'vax             '
datasg ends

stacksg segment
	dw 0,0,0,0,0,0,0,0
stacksg ends

codesg segment
start:
	mov ax,segment
	mov ss,ax

	mov sp,16
	mov ax,datasg
	mov ds,ax
	mov bx,0

	mov cx,4

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

s:	mov al,[bx+si]
	and al,11011111b
	mov [bx+si],al
	inc si
	loop s

	add bx,16
	pop cx
	loop s0

	mov ax,4c00h
	int 21h


codesg ends
end start

问题 7.9

在这里插入图片描述
在这里插入图片描述

assume cs:codesg, ds:datasg, ss:stacksg
stacksg segment
	dw 0,0,0,0,0,0,0,0
stacksg ends

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

codesg segment
start:
	mov ax,stacksg
	mov ss,ax
	mov sp,16

	mov ax,datasg
	mov ds,ax

	mov cx,4
s0:	mov si,0
	push cx
	
	mov cx,4
s:	mov al,[bx+si+3]
	and al,11011111b
	mov [bx+si+3],al
	inc si
	loop s

	and bx,16
	pop cx
	loop s0

	mov ax,4c00h
	int 21h

codesg ends

end start
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值