Ami*_*nis 4 x86 assembly real-mode x86-16
我想在下面的问题中了解AX寄存器的内容,我不明白我怎么知道示例中的[5000h]或[DI]是什么.
寄存器和存储器的状态定义为:
CS=3000 [53000]=BBBB [33000]=6666 [13000]=1111
DS=1000 [54000]=CCCC [34000]=7777 [14000]=2222
SS=5000 [55000]=DDDD [35000]=8888 [15000]=3333
DI=7000 [56000]=EEEE [36000]=9999 [16000]=4444
BP=4000 [57000]=FFFF [37000]=AAAA [17000]=5555
Run Code Online (Sandbox Code Playgroud)
AX中的每个指令的值是多少
MOV AX, [DI]MOV AX, [5000h]MOV AX, [BP+2000h]LEA AX, [BP+1000h]这是一个学术问题,但它触及了实模式20位段的许多概念:偏移寻址.实模式下的所有存储器地址始终由两部分组成 - 段和偏移.将这两部分组合在一起以生成具有以下公式的物理地址:
Run Code Online (Sandbox Code Playgroud)Physical Address = segment * 16 + offset要么
Run Code Online (Sandbox Code Playgroud)Physical Address = segment << 4 + offset
两者都产生相同的结果,因为向左移位4位与乘以16十进制(或十六进制十六进制)相同.
您会发现指令可以明确指定一个段,如果未指定,则始终存在隐式段.一般规则是,如果内存地址使用BP,则内存操作数相对于SS段,否则它相对于DS段.
一个LEA指令实际上没有访问物理内存,它只是计算的内存操作数的有效地址,并在寄存器中加载地址.随着LEA细分市场不发挥作用.阿MOV与内存操作数指令将存储器操作数到内容/从寄存器移动.
您问题中给出的所有值都以十六进制给出.回答你的问题:
MOV AX, [DI]是一样的MOV AX, [DS:DI],因为隐含段DS.在问题DS = 1000h.DI = 7000h.偏移是DI.使用公式段<< 4 +偏移,我们得到物理地址1000h << 4 + 7000h = 10000h + 7000h = 17000h.问题说明了内存地址,[17000]=5555因此移动到AX的值是5555h.
MOV AX, [5000h]是一样的MOV AX, [DS:5000h],因为隐含段DS.在问题DS = 1000h.偏移量为5000h.使用公式段<< 4 +偏移,我们得到物理地址1000h << 4 + 5000h = 10000h + 5000h = 15000h.问题说明了内存地址,[15000]=3333因此移动到AX的值是3333h.
MOV AX, [BP+2000h]MOV AX, [SS:BP+2000h]与隐含段为SS的情况相同.在问题SS = 5000h和BP = 4000h.偏移量为BP + 2000h.使用公式段<< 4 +偏移,我们得到物理地址5000h << 4+(4000h + 2000h)= 50000h +(4000h + 2000h)= 56000h.问题说明了内存地址,[56000]=EEEE因此移动到AX的值是EEEEh.
LEA AX, [BP+1000h]:该段不起作用,因为它是一个LEA指令.在问题BP = 4000h.偏移量为BP + 1000h = 4000h + 1000h = 5000h.由于LEA只计算并存储寄存器中的地址,因此AX中的值将为5000h.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |