Debugging MASM,地址9ffffh
我有一些奇怪的事情。 下面是一个代码示例Debugging MASM,地址9ffffh,debugging,assembly,masm,Debugging,Assembly,Masm,我有一些奇怪的事情。 下面是一个代码示例 CODESEGMENT segment assume CS: CODESEGMENT, DS: CODESEGMENT, SS: NOTHING, ES:NOTHING org 100h BEGIN: mov AX, 9fffh mov DS, AX mov CX, DS:000FH ;--------------------
CODESEGMENT segment
assume CS: CODESEGMENT, DS: CODESEGMENT, SS: NOTHING, ES:NOTHING
org 100h
BEGIN: mov AX, 9fffh
mov DS, AX
mov CX, DS:000FH
;-----------------------------------------------------
;End of program, exit to DOS
;-----------------------------------------------------
mov AX, 4c00h
int 21h
CODESEGMENT ends
end BEGIN
这个密码呢
CODESEGMENT segment
assume CS: CODESEGMENT, DS: CODESEGMENT, SS: NOTHING, ES:NOTHING
org 100h
BEGIN: mov AX, 9000h
mov DS, AX
mov BX, [0FFFFH]
;-----------------------------------------------------
;End of program, exit to DOS
;-----------------------------------------------------
mov AX, 4c00h
int 21h
CODESEGMENT ends
end BEGIN
我想当我从DS得到偏移量时,我有,例如
DS = 9000h
offset = FFFFh
DS = 9000h * 10h = 90000h
+
0FFFFh
=
9FFFFh
这样想,我写了两个代码。
我认为这些代码也做了同样的事情——从地址9FFFFh读取两个字节到CX,但我查看了masm调试器afd,发现我错了
第一个代码:
第二代码
我使用masm是因为我是学生,我已经习惯了。
请告诉我我的错误在哪里。64位段中偏移量0xFFFF处的两个字节是0xFFFF处的字节和0x0000处的字节,这是段的第一个字节。一个段只能寻址64k,您将获取64k+1字节,该字节环绕到开头。第一段代码没有这个问题。但是,为什么我在调试器中的内容彼此不同呢?我想我没有读过你,我的意思是当我有ds=9000h,然后我有偏移ffffh,我没有像9ffffh这样的真实地址?我不知道你在找什么。我为糟糕的英语感到抱歉。我理解了大约两个字节。当我向段寄存器添加偏移量时,内存单元就会得到20位的实地址,这对吗?是的,但如果操作数的第二个或更高字节导致地址溢出16位,则第17位不会被带入DS…它只是被丢弃。因此,如果DS为0x9000,BX为0xFFFF,则16位读取将获取0x9FFFF和0x90000处的字节,而不是0xA0000处的字节。