易只小白鸟 发表于 2018-4-22 23:48:03

关于王爽老师检测点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


这里设置了很多的0,后面用AX把栈段跟数据段设置成同一个,这段是设置的那些0吧,到后面, call word ptr ds:这里,我不太明白ds:这个指向的是哪里,其实都比较乱,希望大神详细讲解一下,十分感谢

ABC23 发表于 2018-4-27 10:57:12

最终ax = 3
=================
call word ptr ds:

word表示字单位转移(2字节),call指令改变IP的值。
代码跳转到inc那里,inc ax三次,于是结果为3

CHAOZHANG283 发表于 2018-9-26 21:48:11

首先,取call指令后,第一件事是将ip指向下一条要执行的指令,由于前期将DS和STACK做了关联,此时DS指向的是栈段的低地址,那么call ds:0eh就相当于跳转到stack:14这样一个位置,即取到了压栈之后的IP值,而此时IP值正好就是inc ax的偏移地址,那么理所当然是执行了第一个inc ax指令,往下依次再执行两次,就得到了ax=3

梦想飞翔的蜗牛 发表于 2019-2-7 12:48:40

开始 ds:处存放的是00,但执行到“call word ptr ds:”,首先push ip ,此时的 ip 是值是11h,入栈,因此 ss:的值是11h,而ss栈与数据ds是相关联的,故ds:与ss:值一样是11h,故“call word ptr ds:”命令就是跳转至11h处,即inc ax处,因上面“mov ax,0”,故最终ax=3
页: [1]
查看完整版本: 关于王爽老师检测点10.5不明白,