检测点10.5
assume cs:codestack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov word ptr ss:,offset s
mov ss:,cs
call dword ptr ss:
nop
s: mov ax,offset s
sub ax,ss:
mov bx,cs
sub bx,ss:
mov ax,4c00h
int 21h
code ends
end start
分析下,最后ax和bx的值各为多少?需要详细的分析过程。 本帖最后由 LinuxDeepin 于 2013-10-28 20:48 编辑
assume cs:code
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,stack ;; 栈段分配 16 个字节,sp = 0010 H
mov ss,ax
mov sp,16
mov word ptr ss:,offset s ;; s 标号物理地址写入 ss: 处
mov ss:,cs
call dword ptr ss: ;; 跳转到 ss: 指定的物理地址处, 并将下一条指令的物理地址入栈, sp-4 = 000c H
nop ;; nop 空指令,占用一个字节
s: mov ax,offset s ;; s 标号偏移地址写入 ax 寄存器,
sub ax,ss: ;; ss: call 下一条代码的偏移地址与 ax 相减 ax = 0001 H
mov bx,cs ;; cs 段地址写入 bx 寄存器
sub bx,ss: ;; ss: call 下一条代码的段地址与 bx 相减 bx = 0000 H
mov ax,4c00H
int 21H
code ends
end start
本帖最后由 福禄娃娃 于 2013-10-28 20:39 编辑
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,stack ;ax=14b6H
mov ss,ax ;ss=14b6H
mov sp,16 ;sp=10H
mov word ptr ss:,offset s ;ss:=001aH
mov ss:,cs ;ss:=14b7H
call dword ptr ss: ;调用标号s处代码
nop
s: mov ax,offset s ;ax=001aH
sub ax,ss: ;ax=0019-001a=0001H
mov bx,cs ;bx=14b7H
sub bx,ss: ;bx=14b7-14b7=0H
mov ax,4c00h
int 21h
code ends
end start
嗯,版主给力,但是“mov word ptr ss:,offset s ;; s 标号物理地址写入 ss: 处 mov ss:,cs ”似乎对于结果没有实质性的作用?真正起作用是从call开始的。
页:
[1]