汇编寻址问题求助:OFFSET与Direct/Indirect寻址下AX值计算
汇编指令寻址与AX值疑问解答
刚接触汇编啃往届考题,卡在这几条指令上太正常了,咱对着代码一步步拆解清楚:
先把你给出的汇编代码贴出来方便对照:
.MODEL medium .STACK 0000 .DATA 0000 04D2 10E1 Count dw 1234,4321 .CODE .STARTUP 0017 BB 0000 R mov bx, OFFSET Count 001A B8 000A mov ax,10 001D 8B C3 mov ax,bx 001F 8B 07 mov ax,[bx] 0021 A1 0000 R mov ax,Count .EXIT END
接下来逐个解决你的疑问:
疑问1:bx中存储的是Count的地址吗?该地址如何确定?
没错,mov bx, OFFSET Count这条指令里的OFFSET就是专门用来取变量的偏移地址的。
在你用的.MODEL medium(中型模式)下,DATA段的偏移地址从0000H开始,而Count是DATA段里定义的第一个变量——从代码里的DATA段标注0000 04D2 10E1 Count dw 1234,4321也能看出来,开头的0000就是Count的偏移地址。所以执行这条指令后,bx里存的就是Count的偏移地址0000H。
疑问2:执行mov ax,[bx]后,ax中的值是多少?
mov ax,[bx]是寄存器间接寻址——说白了就是把bx里存的地址当指针,去内存里捞对应位置的数据。Count是dw(字类型,占2字节),定义的第一个值是1234,转成十六进制是04D2H。虽然x86是小端存储,但这里我们取的是完整的一个字,直接取Count起始地址(0000H)处的字数据就行,也就是04D2H,对应十进制的1234。所以执行这条指令后,ax的值就是1234(或04D2H)。
疑问3:mov ax,Count的执行结果是否与上一条指令相同?
结果完全相同,但寻址方式不一样:
mov ax,[bx]是寄存器间接寻址,靠bx里的地址去内存取值;mov ax,Count是直接寻址,编译器会直接把Count的偏移地址编译到指令里,直接从对应内存位置取第一个字的值。
两者最终都是取Count的第一个元素04D2H(1234),所以ax的结果和上一条指令完全一致。
内容的提问来源于stack exchange,提问作者pureundergrad
相关产品推荐
相关产品推荐

