分段

  • 问题1
    • 8086是16位cpu,最多可以访问(寻址)多大内存?
  • 问题2
    • 8086允许最大内存1M,如何实现访问(寻址)到所有内存?
  • 分段寻址
    • 将内存划分成多段,通过段基址+段偏移的方式访问
    • image.png
  • 计算方式
    • 内存地址=段基址*10h+段偏移
  • 例子:image.png
  • 名词
    • 1. 段基址+段偏移 的方式一般写作 段地址:段偏移,称作逻辑地址
    • 2. 偏移地址称作EA effective address
    • 3. 通过逻辑地址计算出来的内存地址称作物理地址

image.png

  • 问题
    • 一个物理地址是否只能由一个逻辑地址表示?
  • image.png
  • 可用内存
    • dos系统值编程,应用程序可用内存约600K
    • image.png
  • 段寄存器
    • 8086中,段基址都是存储在段寄存器中,段偏移可以用立即数或者通用寄存器指明。 02-分段和机器码的组成 - 图602-分段和机器码的组成 - 图7
  • 段超越:
    • 8086寻址方式中,有一些默认段寄存器的情况。例如,如果用BP作为基址寻址的单元,则可表明此单元位于SS段;如果用BX作为基址寻址的单元,则可表明此单元位于DS段。但在某些特例下,需要进行段超越寻址,应使用段属性前缀。
    • MOV CX,ES:[BX]
    • 这条指令是把ES段中的偏移地址为BX的单元中的字送CX,而不是到DS段去寻址。
    • 无论用BX,SI,DI或者BP作为间接寄存器,都允许段超越。
  • 问题

    • 1M的内存寻址需要多少根引脚?

image.png
image.png
image.png

操作码 [目的操作数][源操作数]

  1. 89C3 MOV BX,AX 1000 1001 1100 0011
  2. 89CB MOV BX,CX 1000 1001 1100 1011
  3. 89D3 MOV BX,DX 1000 1001 1101 0011
  4. 89DB MOV BX,BX 1000 1001 1101 1011
  5. 89E3 MOV BX,SP 1000 1001 1110 0011
  6. 89EB MOV BX,BP 1000 1001 1110 1011
  7. 89F3 MOV BX,SI 1000 1001 1111 0011
  8. 89FB MOV BX,DI 1000 1001 1111 1011
  9. # mov [reg16],[reg16] 89...(11 后六位为两个寄存器编号)
  10. # MOV BX,AX 1000 1001 1100 0011
  11. #mov [reg],[reg]-> 1000 1001 11 000 011
  12. #最后六个,前三个为源操作数寄存器编号,后三个为目标操作数寄存器编号
  13. #与 [reg],[reg]的顺序相反
  14. 89C3 MOV BX,AX 1000 100 1 11 000 011
  15. 89CB MOV BX,CX 1000 100 1 11 001 011
  16. 89D3 MOV BX,DX 1000 100 1 11 010 011
  17. 89DB MOV BX,BX 1000 100 1 11 011 011
  18. 89E3 MOV BX,SP 1000 100 1 11 100 011
  19. 89EB MOV BX,BP 1000 100 1 11 101 011
  20. 89F3 MOV BX,SI 1000 100 1 11 110 011
  21. 89FB MOV BX,DI 1000 100 1 11 111 011
  22. #寄存器对应编号
  23. #ax cx dx bx sp bp si di
  24. #000 001 010 011 100 101 110 111
  25. mov si, di
  26. 1000 1001 1111 1110 89fe
  27. #8位寄存器 mov操作
  28. # mov [reg8],[reg8] 88...(11 后六位为两个寄存器编号)
  29. 88C7 MOV BH,AL 1000 1000 1100 0111
  30. 88E7 MOV BH,AH 1000 1000 1110 0111
  31. 88DF MOV BH,BL 1000 1000 1101 1111
  32. 88FF MOV BH,BH 1000 1000 1111 1111
  33. 88CF MOV BH,CL 1000 1000 1100 1111
  34. 88EF MOV BH,CH 1000 1000 1110 1111
  35. 88D7 MOV BH,DL 1000 1000 1101 0111
  36. 88F7 MOV BH,DH 1000 1000 1111 0111
  37. 88C7 MOV BH,AL 1000 100 0 11 000 111
  38. 88E7 MOV BH,AH 1000 100 0 11 100 111
  39. 88DF MOV BH,BL 1000 100 0 11 011 111
  40. 88FF MOV BH,BH 1000 100 0 11 111 111
  41. 88CF MOV BH,CL 1000 100 0 11 001 111
  42. 88EF MOV BH,CH 1000 100 0 11 101 111
  43. 88D7 MOV BH,DL 1000 100 0 11 010 111
  44. 88F7 MOV BH,DH 1000 100 0 11 110 111
  45. #8位寄存器 mov操作
  46. # mov [reg8],[reg8] 88...(11 后六位为两个寄存器编号)
  47. #al cl dl bl ah ch dh bh
  48. #000 001 010 011 100 101 110 111
  49. 89FE MOV SI,DI 1000 1001
  50. 88FE MOV DH,BH 1000 1000
  51. 89C3 MOV BX,AX 1000 10 0 1 11 000 011
  52. 89CB MOV BX,CX 1000 10 0 1 11 001 011
  53. 89D3 MOV BX,DX 1000 10 0 1 11 010 011
  54. 89DB MOV BX,BX 1000 10 0 1 11 011 011
  55. 89E3 MOV BX,SP 1000 10 0 1 11 100 011
  56. 89EB MOV BX,BP 1000 10 0 1 11 101 011
  57. 89F3 MOV BX,SI 1000 10 0 1 11 110 011
  58. 89FB MOV BX,DI 1000 10 0 1 11 111 011
  59. 88C7 MOV BH,AL 1000 10 0 0 11 000 111
  60. 88E7 MOV BH,AH 1000 10 0 0 11 100 111
  61. 88DF MOV BH,BL 1000 10 0 0 11 011 111
  62. 88FF MOV BH,BH 1000 10 0 0 11 111 111
  63. 88CF MOV BH,CL 1000 10 0 0 11 001 111
  64. 88EF MOV BH,CH 1000 10 0 0 11 101 111
  65. 88D7 MOV BH,DL 1000 10 0 0 11 010 111
  66. 88F7 MOV BH,DH 1000 10 0 0 11 110 111
  67. #注意: 如 1000 1011 0000 0111 后8位中的前两位解析:
  68. #00表示mov 的操作数为内存到寄存器(无常量),
  69. #01表示内存到寄存器(跟一个8位的立即数),
  70. #10表示内存到寄存器(跟一个16位的立即数),
  71. #11表示寄存器到寄存器
  72. 8B07 MOV AX,[BX] 1000 10 1 1 00 000 111
  73. 8B05 MOV AX,[DI] 1000 10 1 1 00 000 101
  74. 8B03 MOV AX,[BP+DI] 1000 10 1 1 00 000 011
  75. 8B00 MOV AX,[BX+SI] 1000 10 1 1 00 000 000
  76. 8B4212 MOV AX,[BP+SI+12] 1000 10 1 1 01 000 010 disp8
  77. 8B825634 MOV AX,[BP+SI+3456] 1000 10 1 1 10 000 010 disp16
  78. 8A825634 MOV AL,[BP+SI+3456] 1000 10 1 0 10 000 010 disp16
  79. 8B817856 MOV AX,[BX+DI+5678] 1000 10 1 1 10 000 001 disp16
  80. 89817856 MOV [BX+DI+5678],AX 1000 10 0 1 10 000 001 disp16
  81. #另外,第七位是0或者1,表示的是数据的来源是寄存器还是内存(目的操作数)
  82. #第八位为0表示操作数的位数为8位,为1表示操作位的位数为16位
  1. //a 1010 b 1011 c 1100 d 1101 e 1110 f 1111
  2. C6870005FF
  3. mov byte [bx+500],ff
  4. 1100, 0110, 10(mod) 00, 0111, 0000, 0000,0000, 0101, 1111, 1111
  5. C607ff
  6. mov byte [bx],ff
  7. 1100, 0110, 00(mod) 00, 1001, 1111, 1111
  8. C64710FF
  9. mov byte ptr [bx+10],ff
  10. 1100, 0110, 01(mod) 00, 1001, 0001, 0000, 1111, 1111
  11. 883f
  12. mov byte ptr [bx],bh
  13. 1000, 1000, 00(mod) 11, 1111

mov指令总结

image.png
image.png

MOV指令机器码及其解析

  1. MOV = Move 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
  2. 寄存器/内存->寄存器/内存 1 0 0 0 1 0 d w mod reg r/m ;
  3. 立即数 -> 寄存器/内存 1 1 0 0 0 1 1 w mod 0 0 0 r/m data data if w = 1
  4. 立即数 -> 寄存器 1 0 1 1 w reg data data if w = 1 ;
  5. 内存 -> 累加器 1 0 1 0 0 0 0 w addr-low addr-high ;
  6. 累加器 -> 内存 1 0 1 0 0 0 1 w addr-low addr-high ;
  7. 寄存器/内存-> 段寄存器 1 0 0 0 1 1 1 0 mod 0 Sreg r/m ; Sreg表示段寄存器
  8. 段寄存器 -> 寄存器/内存 1 0 0 0 1 1 0 0 mod 0 Sreg r/m ;
  9. 解释:第一列表示数据从 源操作数->目的操作数
  10. reg/m 它们都是有三位二进制数表示,寄存器是有对应编号(8位和16位要看w的值),内存是要有以下几种组合:
  11. [reg] [reg+reg] [reg+imm] [reg+reg+imm];其中reg,reg+reg所对应的有编号 有立即数的话后面就要跟立即数的数据
  12. w表示的是操作数是16位还是8位,w=1表示操作数是16w=0表示操作数是8位的,由于8位寄存器和16位都是由3位二进制
  13. 数来进行编码的,因此需要以此区分。(通用寄存器,段寄存器不存在这种区分)
  14. d表示数据来源是内存还是寄存器 d=0表示数据来源是寄存器,d=1表示数据来源是内存
  15. mod 指的是那种方式,由2位二进制数据来表示,
  16. 00表示[EA]中无常量
  17. 01表示[EA]中常量单字节
  18. 10表示中常量双字节
  19. 11表示寄存器操作
  20. reg通用寄存器对应编码:
  21. 16位通用寄存器:
  22. ax cx dx bx sp bp si di
  23. 000 001 010 011 100 101 110 111
  24. 8位寄存器:
  25. al cl dl bl ah ch dh bh
  26. 000 001 010 011 100 101 110 111
  27. Sreg段寄存器对应编码:
  28. es cs ss ds
  29. 00 01 10 11
  30. #[EA] 内存对应
  31. 000 EA = BX+SI + DISP
  32. 001 EA = BX+DI + DISP
  33. 010 EA = BP+SI + DISP
  34. 011 EA = BP+DI + DISP
  35. 100 EA = SI + DISP
  36. 101 EA = DI + DISP
  37. 110 EA = BP + DISP
  38. 111 EA = BX + DISP

作业:实现以下指令的汇编和反汇编

mov r16, r16 OK
mov r8, r8 OK
mov r16, [EA] OK
mov r8, [EA] OK
mov [EA], r16 NO
mov [EA], r8 NO
mov r8, imm8 OK
mov r16, imm16 OK
mov [EA], imm8 部分
mov [EA], imm16 部分