项羽姓秦 发表于 2020-3-6 00:35:34

检测点10.5作业练习

(1)下面的程序执行后,ax 中的数值为多少?
assume cs:code
stack segment
        dw 8 dup (0)
stack ends

code segment
start:        mov ax,stack
                mov ss,ax
                mov sp,16
                mov ds,ax
                mov ax,0
                call word ptr ds:
                inc ax
                inc ax
                inc ax
                mov ax,4c00h
                int 21h
code ends
end start

最终ax的值为3,这么有趣的程序,我就不解释了,大家去玩吧。

(2)下面的程序执行后,ax 和 bx 中的数值为多少?
assume cs:code
data segment
        dw 8 dup (0)
data ends
code segment
start:        mov ax,data
                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=1,bx=0;

大家直接上程序,细心分析吧。

双人旁 发表于 2020-3-18 17:47:29

能解释下第一个吗,为什么执行后存的下一条指令的偏移

项羽姓秦 发表于 2020-3-19 00:46:10

双人旁 发表于 2020-3-18 17:47
能解释下第一个吗,为什么执行后存的下一条指令的偏移

这个程序在执行call word ptr ds:之前,程序中的cs的值已经入栈,ip的地址也已经准备好执行下一条程序了,然后ip值转移到ds:,ip的值就是指向下一条的指令,所以,直接向下执行了。但是程序就不会向下执行,{:5_109:}

yuxinajie 发表于 2020-6-19 13:08:21

AX=(NOP+1)-(NOP)=1
BX=(CS)-(CS)=0

yuxinajie 发表于 2020-6-19 13:10:42

双人旁 发表于 2020-3-18 17:47
能解释下第一个吗,为什么执行后存的下一条指令的偏移

CALL指令的规定,因为如果要配合RET指令,要跳回去,跳哪里呢?就是CALL的下一条指令的地方,继续往下执行,所以,他只能压入下一条指令的偏移地址
页: [1]
查看完整版本: 检测点10.5作业练习