今天要做什么:
汇编语言练习准备
MOV中可以写二进制
add bx, ax
Add cx, ax
一:Intel 8086处理器因硬件设计的特点而在访问内存时所面临的挑战
1:16根地址线1次最多可以传输的数据是两个字节,也就是2的16次方数,20跟地址线是2的20次方1048576b=1024kb=1mb
2:原则上,代码段寄存器CS用于存储代码段起始物理地址(然后根据程序指令长度相加),数据段寄存器DS用于存储数据段物理地址起始地址(每次都和代码段保存的偏移地址相加)
3:如果是20位地址线,内存中保存的也是20位,但是数据段寄存器和程序段寄存器是16位的,如果20位是转换后最后一位是0,可以先去掉,后面在寄存器中取出的时候在左移加上,但是如果不是0
4:在处理器中有IP寄存器,当从CS寄存器中取出16位寄存器左移四位例如30CE得到30CE0,然后和IP中的0000相加,还是30CE0
5:将偏移地址0000处的一个字传送到AX寄存器,从数据段寄存器DS中取出16进制数
例如:33CE,左移四位得到33CE0,然后和偏移地址0000相加,得到33CE0
6:于此同时指令指针寄存器IP修改为下一个指令的偏移地址 0003,将CS数据段寄存器30CE
左移四位得到20位的数字30CE0,和指令指针寄存器中的偏移地址0003相加,从30CE3中取出第二条指令30CE3.
7:将AX中的内容和偏移地址0002处的字相加,从数据段寄存器33CE中取出数据,左移四位得到33CE0,然后和数据偏移地址0002处的长度相加,得到33CE2,
于此同时,指令指针寄存器中的数据进行长度累加3+4=7
二:逻辑地址和分段的灵活性
新的表示方式
1:在8086处理器存在的系统中,访问任何一个内存单元都是由段寄存器乘以16,形成20位的段地址,在和偏移地址相加,想访问一个内存单元,光知道物理地址还不行,必须转换成16位的段地址和16位的偏移地址
2:在8086系统中,偏移地址只能是16位的(最大FFFF也就是64k)不能是20位的
得到程序最后的物理地址,用逻辑地址A037:FFFF就可以求出,用A037 乘以16,也就是左移四位,得到A0370在加上逻辑偏移地址FFFF,
A+1= B
0+F = 16+0
3+F +1= 16+3
7+F = 16+6
0+F = F
也就是这个段起始于A0370,结束于B036F.
练习:
1:
DB000+FFFF = 最大物理地址
DB000+0028 = DB028
2
思考:离这个物理地址最近,且比它小的物理地址段为B0370、B0360、B0350 B0375与这三个物理地址段的距离分别为5、15、和25.所以可以用B037:0005、B036:0015和B035:0025
3
因为段必须起始于以0结尾的物理地址,而两个相邻的这种地址相差16个字节,比如段地址00000和段地址00010 之间相差16个字节。1MB内存右1048576个字节,除以16结果是65536.所以1MB内存可以均匀划分为65536个16字节的段。
1MB内存等于1024KB,如果段的长度是64KB,那么1024KB除以64KB 结果是16,即1MB内存可以均匀划分为16个64KB的段。
4:一个字含有两个字节和16个比特,一个双字含有4个字节2个字和32个比特
5:二进制数1000 0000,位(7)的那个比特是 1,也就是第8位,最高位
6:一个储存器的容量是16个字节,地址范围是00-FF,用该储存器保存字数据时,可存放8个字,这些地址的范围,00、02、04、06、08、0A、0C、0E 双字为04、08、0C
7:
8:Intel 8086处理器右8个16位通用寄存器,分别是(AX、BX、CX、DX、SI、DI、BP、SP)
其中,有些还可以分开来作为两个独立的8位寄存器来用,这几个8位寄存器分别是(AH、AL、BH、BL、CH、CL、DH、DL)
9:Inter 8086处理器取用指令时,使用段寄存器CS和指令指针寄存器IP,方法是,将段寄存器的值左移4位,或者乘以16,加上指令指针寄存器的当前值,形成物理地址访问内存
10:物理地址132FEH对应的逻辑是(),
也就是因寄存器先去掉最后一位,后面再加,将前面逻辑段地址乘以16或者左移4位,然后和偏移地址相加,不要错位。
A:132F0+000E B:13000+02FE C:10000+132FE F:0FE00+34FE=132FE
11:数据段寄存器DS的值为258CHShiite,计算inter8086可以访问的物理地址范围?
258C:0000~258C:FFFF,换算成物理地址时 25BC0+FFFF = 35BBF
12:MOV ax,3fh等效 MOV AX,3FH等效 MOV ax,3FH等效 mov AX,3fh
mov 目的操作数,源操作数
MOV ax 3fh #这个3fh中的h,是十六进制指示符,千米i按的3f是16进制,3fh可以写成0x3f
MOV中可以写二进制
add bx,ax
add cx,ax
推荐下载方便好用编辑器和NASM编译器
https://www.nasm.us/
将汇编语言程序编译成机器语言