對于8086的cpu來說
- 段地址必須為16的倍數(shù)
- 偏移地址是16位的(最大是16位虐秋,因?yàn)閿?shù)據(jù)總線只有十六跟最大支持16位,再多就傳不了了)最大的尋址能力是64K所以一個段的最大長度是64K
段寄存器
- 8086特有的 存放段地址和偏移地址的
- 要想告訴cpu 一個地址是一個段的段地址要這樣做:
mov 段寄存器, FFCAH 告訴cpu FFCAH是一個段的段地址 - 8086cup在訪問內(nèi)存的時候由段寄存器提供內(nèi)存單元的段地址和偏移地址急前,送入地址加法器,合成物理地址
- 8086有四個段寄存器:CS,DS,SS, ES台盯。當(dāng)CPU需要訪問內(nèi)存的時候由這四個寄存器提供內(nèi)存單元的段地址
CS: 代碼段寄存器
DS:數(shù)據(jù)段寄存器
SS:堆棧段寄存器
ES:附加段寄存器 - CPU區(qū)分傳過來的是什么:放地址付給cs段就是代碼指令,付給ds段就是數(shù)據(jù)
段寄存器提供段地址那么偏移地址是誰提供的呢畏线?
CS: <small>CS 和 ip</small>
- cs為代碼段寄存器 ip為指令指針寄存器 他們指示了當(dāng)前要讀取的指令的地址
- 定位具體地址寫法: cs : ip 例如 0x1222: 0x0001
- 任意時刻静盅,CPU都會將cs : ip 指向的指令作為下一條需要取出執(zhí)行的指令
- 大端 高高低低 小段 高低高低 由CPU決定
jmp指令
<small>8086cup是不允許cpu直接給cs和ip賦值的,像這樣 mov cs, ac23H mov ip, 000H象踊。但是温亲,提供了指令來給他們賦值就是jmp指令</small>
jmp 段地址: 偏移地址
- 舉例
jmp 3: 0bl6----結(jié)果 cs:0003H , ip: 0bl6H z最終得到的地址 00b46H,cpu將會從此處讀取指令 - 如果不想改變cs 只想改變ip的值 jmp還提供了另一只寫法
mov ax, 1000H
jmp ax
- 結(jié)果
區(qū)別 | ax | cs | ip |
---|---|---|---|
執(zhí)行前 | 1000H | 0234H | 0023H |
執(zhí)行后 | 1000H | 0234H | 1000H |
- 修改ip的操作包括
- 讀指令
- jmp 指令
練習(xí): 下面三條指令執(zhí)行后杯矩,cpu修改了幾次ip栈虚,都在什么時候,最后ip為多少史隆?
mov ax魂务, bx
sub ax,bx
jmp ax
答:一共修改了四次ip 前三次是執(zhí)行指令最后一次是執(zhí)行jup ax指令最后ip為 0000Hcs指令的執(zhí)行過程詳見hank老師的匯編(三)