《汇编语言》读书笔记(第7~9章)

七、更灵活的定位内存地址的方法

1.and和or

and:进行按位置与运算,可用来对相应位置置0
or:进行按位或运算,可用来对相应位置置1

2.关于ASCII、以字符形式给出的数据

在计算机中,采取ASCII编码,将人能理解的信息存入到计算机,再从计算机中取出。
在汇编程序中,字符形式的数据会被编译器转化为相对应的ASCII码。

3.大小写转换的问题

通过对比可以知道,小写字母的ASCII码值比大写字母的大20H。要实现转换,还要能够判断当前字母是大写或小写,但目前所学指令无法对其进行判断。又发现大小写字母ASCII码仅有一位不同,可通过and或or对其进行置1或置0完成转换。

4.[bx+idata]

指令:mov ax,[bx+200]
数学化描述:(ax)=((ds)*16+(bx)+200)
该指令也可以写成其他格式:
mov ax,200[bx]或mov ax,[bx].200

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

原来用[bx]的方式定位字符串中的字符:

  mov bx,0
  mov cx,5
s:mov al,[bx]
  and al,11011111b
  mov [bx],al
  inc bx
  loop s

用[bx+idata]的方式简化:

  mov bx,0
  mov cx,5
s:mov al,[bx]
  and al,11011111b
  mov [bx],al
  mov al,[bx+5]
  or al,00100000b
  mov [bx+5],al
  inc bx
  loop s

将两个字符串看作两个数组,他们的起始偏移地址不同,但相对地址的变化是相同的。

6.SI和DI

si和di是和dx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。
指令:mov ax,[bx+si]
数学化的描述:(ax)=((ds)*16+(bx)+(si))
指令:mov ax,[bx+si+idata]
数学化的描述:(ax)=((ds)*16+(bx)+(si)+idata)

7.不同的寻址方式的灵活运用

遇到二重循环问题的时候,需要使用内存来暂存数据,使用栈是比较方便的做法。

八、数据处理的两个基本问题

0.前言

定义描述性符号:
reg表示寄存器;
sreg表示段寄存器,包括ds、ss、cs、es

1.bx、si、di、bp

a)在8086CPU中,只有这4个寄存器可以用在“[…]”中来进行内存单元的寻址。
b)在[ ]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
c)只要在[…]中使用寄存器bp,而指令中没有显性地给出段地址, 段地址就默认在ss中。

2.机器指令处理的数据在什么地方

a)绝大部分机器指令都是进行数据处理的指令,大致分为:读取,写入,运算三类;
b)在机器指令这一层来讲,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置。指令在执行前,所要处理的数据可以在3个地方:CPU内部、内存、端口。

3.汇编语言中数据位置的表达

a)立即数
b)寄存器
c)段地址和偏移地址

4.寻址方式

当数据存放在内存中的时候,可以用多种方式给定这个内存单元的偏移地址,这种给定内存单元的方法一般被称为寻址方式。
在这里插入图片描述

5.指令要处理的数据的长度

1.通过寄存器名要处理的数据的尺寸

如ax,al寄存器,ax是十六位寄存器,al是ax的低八位。

2.通过操作符 X ptr 指明内存单元的长度

move word ptr ds:[0],1或
move byte ptr ds:[0],1

3.其他方法

如push指令只执行字操作

6.寻址方式的综合应用

一般来说,可以用[bx+idata+si]的方式访问结构体中的数据,用bx定位整个结构体用idata定位结构体中的某一个数据项,用si来定位数据项中的每个元素。

7.div指令

即除法指令

1.除数(即分子)

有8位和16位两种,在一个寄存器-或内存单元中。

2.被除数(即分母)

默认在AX或AX和DX中,若除数为8位,则被除数位16位,在AX中;若除数为16位,被除数为32位,DX存放高16位,AX放低16位。

3.结果

若除数为8位,AL存储结果,AH存储余数;
若为16位,AX存结果,DX存余数

8.伪指令dd

db用来定义字节型数据
dw用来定义字型数据
dd用来定义double型数据
db 1 ->0X01
dw 1 ->0X0001
dd 1–>0X000001

9.dup

dup是操作符,同db,dd等一样,由编译器识别处理,用来重复数据。比如:
db 3 dup(0):定义了三个字节,值位0;
db 3 dup(0,1,2):定义了九个字节

九、转移指令的原理

1.操作符offset

操作符。取得标号的偏移地址。

2.jmp指令

无条件转移指令,可以修改ip或cs和ip;
jmp指令要给出两种信息:1.转移的目的地址;2.转移的距离
不同的给出地址的方式和不同的转移位置有不同格式的jmp指令

3.依据唯一进行转移的jmp指令

1.CPU在执行jmp指令的时候并不需要目的地址,jmp short 标号 指令对应的机器码中,包含的是转移的位移,这个位移,是相对于当前IP的转移位移。是编译器根据汇编指令中的标号计算出来的。
2.“jmp short 标号”:段内短转移,(ip)=(ip)+8,位移的范围:-128~127
“jmp near ptr 标号”:段内近转移,(ip)=(ip)+16,位移的范围:-32768~32767

4.转移的目的地址在指令中的jmp指令

“jmp ptr far 标号”:段间转移(远转移)
其对应的机械码包含转移的目的地址,高地址的是转移的段地址,低地址的是转移的偏移地址。

5.转移地址在寄存器中、内存中的jmp指令

1.jmp 16位 reg
2.在内存中:
1.jmp word ptr 内存单元地址(段内)
2.jmp dword ptr 内存单元地址(段间):高地址存放目的段地址
例如:mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
执行后 (cs)=0(ip)=0123H

6.jcxz指令

有条件的转移指令,都是短转移
jcxz 标号(如果(cx)=0(即cx 的值为zero),转移到标号处执行,否则向下执行)

7.loop指令

循环指令,都是短转移,对应的机器码中包含转移的位移。
指令格式:loop 标号((cx)=(cx)-1,若(cx)!=0,转移到标号处执行)

8.根据位移进行转移的意义

方便了程序段在内存中的浮动装配,程序在内存中的不同位置都可以正确执行。
编译器会对转移位移进行超界的检测。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值