汇编代码复习7

ps:此处提一下易错的知识点,表示自己一开始也没搞懂,就是mov ax,[bx]这条指令,将存储单元[bx]内的数据
赋给寄存器ax,则是将[bx]的一个字节赋给ax的地位,将下一个存储单元[bx+1]的数据传入ax的高位ah。

本次主要分析第七章,大致内容分为以下几方面:
		1.and和or命令
		2.关于ASCLL码
		3.以字符形式给出的数据
		4.大小写转化的问题
		5.[bx+idata]
		6.用[bx+idata]的方式进行数组的处理
		7.SI和DI
		8.[bx+si]与[bx+di]
		9.[bx+si+idata]与[bx+di+idata]
		10.不同的寻址方式的灵活运用
1.
and指令:逻辑与指令,按位进行与运算
	例如指令:mov al,01100011B
			 and al,00100011B
	执行后输出的结果是:al=00100011B
	原因是and指令可以将指定位设为0,其他位不变
	将and al,巴拉巴拉(何处为1,al中何处设为0,但是要注意,从右到左是以0开始的)
or指令:逻辑或指令,按位进行与运算
	例如指令:mov al.01100011B
			 or al,00111011B
	执行后输出的结果是:al=01111011B
	原因是or指令可以将指定为设为1,其他位不变
	同and理

2.	
	其实没啥好说的,ASCII码就是将所有的符号编出顺序,方便使用
	计算机运行原理:使用计算机进行键盘敲击,在敲出的同时,计算机将键位信息输入CPU中,进行提取相应键位内的数据
	,然后将提出的数据进行输出到计算机显示屏上。

3.以字符形式给出的数据
	例如:
	assume cs:code,ds:data
	code segment
		db 'unIX'
		db 'foRX'
	code ends
	data segment
	...
	...
	...
	data ends
	end

	以上代码中的两个代码在debug上运行并将字符数据输入到ax中之后,进行d命令查看的话,会看到相对的地址上存储的
	是对应该字符的ASCII码。
	这就是计算机存储数据的原理。

4.大小写转化的问题
	首先大小写的实质区别就是ASCII码不一样,但是如果用现学的知识的话,命令不支持判断大小写,但是如果仔细
	判断的话,就会发现大小写的ASCII码相差32,刚好是ASCII码用二进制表示的从右到左数的第五位(起始为第0位)
	,所以不
	经判断,直接使用上面的and和or命令对字符进行转换。
	//直接上代码 ps:此处代码不可以直接粘贴使用,因为并没有将对应代码的空格对整齐
	assume ds:a,cs:b
	a segment
		db 'QWsds'
		db 'SdiisdiiDWO'
	a ends

	b segment
	start:
		mov ax,a
		mov ds,ax

		mov bx,0
		
		mov cx,5
	s:	mov al,[bx]
		and al,110111111B
		mov [bx],al
		inc bx
		loop s

		mov bx,5
		mov cx,10
	s0:	mov al,[bx]
		or [bx],00100000B
		mov [bx],al
		inc bx
		loop s0

		mov ax,4c00h
		int 21h

b ends
end	start
	

在这里插入图片描述

这是运行一点,将数据输入的内容。

在这里插入图片描述

这是全部运行后的,其中共16个字符,我自=只运行了15个循环,所以最后一位不变,保持了大写
5.[bx+idata]
	[bx+idata]是一个更加灵活的内存单元,
	例如		mov ax,[bx+idata]
	相当于	
			mov bx,idata
			mov ax,bx
	还可以写成其他格式	mov ax,[idata+bx]    mov ax,idata[bx]    mov ax,[bx].idata
	主要作用就是更简单的写代码,例如
	start:
		mov ax,a
		mov ds,ax

		mov bx,0
		
		mov cx,5
	s:	mov al,[bx]
		and al,110111111B
		mov [bx],al
		inc bx
		loop s

		mov bx,5
		mov cx,10
	s0:	mov al,[bx]
		or [bx],00100000B
		mov [bx],al
		inc bx
		loop s0
	没错,就是照抄上面的代码,但是如果使用[bx+idata]呢?
	start:
		mov ax,b
		mov ds,ax

		mov bx,0
		
		mov cx,5
	s:	mov al,[bx]			//此刻表示对[bx]位置的字符进行操作
		and al,11011111B
		mov [bx],al
		mov al,[bx+5]		//此刻表示对[bx+5]位置的字符进行操作
		or al,00100000B
		mov [bx+5],al
		mov al,[bx+10]
		//此刻表示对[bx+10]的字符进行操作,因为我们需要操作十五个字符,其中五个小写,所以大写分两次操作
		or al,00100000B
		mov [bx+5],al
		inc [bx]
		loop s
//由此可见,[bx+idata]确实方便很多,但是也有不方便的一点,就是如果两样数据数量表示没有规律 的话,也不方便

7.SI和DI是CPU中与bx功能相近的寄存器,但是SI和DI不能够分成两个八位的寄存器来使用,但是却可以用[si+idata]
来准确的指向需要定位的存储单元
例如	mov ax,[bx]		mov ax,[si]		是一样的
但是!如果仅仅是此作用的话,这个笔记将毫无意义,所以重点来啦,SI和Di关系着寄存器的寻址方式
正如图所示,如果'db'了四行字符例如
db 'abc'
db 'qwe'
db 'asd'
db 'zxc'
	那么在数据的存储结构就如图
		0	1	2	3	4	5	6	7	8	9	A	B	C	D	E	F
R=00  | a | b | c |   |   |   |   |   |   |   |   |   |   |   |   |   |
  10  | q | w | e |   |   |   |   |   |   |   |   |   |   |   |   |   |
  20  | a | s | d |   |   |   |   |   |   |   |   |   |   |   |   |   |
  30  | z | x | c |   |   |   |   |   |   |   |   |   |   |   |   |   |
  此刻SI和DI的作用就出来了,用[bx]表示第一行的开始的位置,而si和di在循环套循环中作为代数存储数据。
  
  
													参考书籍《汇编语言第四版》王爽著,任课老师 胡海芝 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值