ttxs_2013 发表于 2013-10-28 17:23:39

检测点10.5

assume cs:code
stack 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 17:23:40

本帖最后由 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:38:12

本帖最后由 福禄娃娃 于 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

ttxs_2013 发表于 2013-10-28 22:28:09

嗯,版主给力,但是“mov word ptr ss:,offset s    ;; s 标号物理地址写入 ss: 处   mov ss:,cs   ”似乎对于结果没有实质性的作用?真正起作用是从call开始的。
                           
页: [1]
查看完整版本: 检测点10.5