项羽姓秦 发表于 2020-3-5 23:33:36

检测点10.3作业练习

assume cs:code

code segment
start:        mov ax,0
                call far ptr s
                inc ax
        s:        pop ax
                add ax,ax
                pop bx
                add ax,bx
               
                mov ax,4c00h
                int 21h
code ends
end start

;结果ax=1010h为什么呢?

;因为在准备执行call far ptr s指令之前,ip已经指向1000:8
;所以,在执行之后,pop ax输出来的值为0008
;然后程序往下执行自加,ax=0010h
;再往下执行输出bx为1000,因为输出的是cs的值,所以bx为1000h
;最后ax=ax+bx=1010h

jackz007 发表于 2020-3-6 00:02:01

本帖最后由 jackz007 于 2020-3-6 00:09 编辑

1433:0000 B80000      MOV        AX,0000                              
1433:0003 9A09003314    CALL       1433:0009    ; 这里跳到 1433:0009,下一条指令的地址 (1433:0008) 就是返回地址,堆栈中就是这一对数值
1433:0008 40            INC        AX                                 
1433:0009 58            POP        AX         ; AX = 返回地址 1433:0008 的偏移值 0008
1433:000A 03C0          ADD        AX,AX      ; AX = 0008 + 0008 = 0010                     
1433:000C 5B            POP        BX         ; BX = 返回地址 1433:0008 的段地址 1433
1433:000D 03C3          ADD        AX,BX      ; AX = 0010 + 1433 = 1443
1433:000F B8004C      MOV        AX,4C00                           
1433:0012 CD21          INT        21                                 

项羽姓秦 发表于 2020-3-6 00:11:28

jackz007 发表于 2020-3-6 00:02


{:5_109:}你的也没有错,但是题目出的地址是在1000:0,所以按照题目来。

jackz007 发表于 2020-3-6 00:13:24

项羽姓秦 发表于 2020-3-6 00:11
你的也没有错,但是题目出的地址是在1000:0,所以按照题目来。

       我这是 debug 实测环境的结果。

项羽姓秦 发表于 2020-3-6 00:23:46

jackz007 发表于 2020-3-6 00:13
我这是 debug 实测环境的结果。

嗯,我知道
页: [1]
查看完整版本: 检测点10.3作业练习