奥普瓯江 发表于 2018-8-25 16:21:24

监测点10.5

本帖最后由 奥普瓯江 于 2018-8-25 16:32 编辑

(1)下面的程序执行后,ax中的数值为多少?(注意:用call指令的原理来分析,不要在Debug中单步跟踪来验证你的结论。对于此程序,在Debug中单步跟踪的结果,不能代表CPU的实际执行结果。)
assume cs:code
stack segment
      dw 8 dup (0)
stack ends

code segment
start: mov ax, stack               ;把stack的段地址传给ax
      mov ss, ax                      ;把ax中的数据传给栈寄存器,作为栈使用
      mov sp, 16                     ;使得栈指针指向第16个字节(我也忘了是否叫不叫指针)
      mov ds, ax                      ;把stack的段地址传给ds(ax中以传入stack中的段地址)
      mov ax, 0                        ;ax等于0
      call word ptr ds:      ;先把inc ax 中的偏移地址传入栈中在跳转,所以在这里inc ax中的地址是先压如到栈的第EF字节中然后在跳转inc ax中因为ds和ss调用的是同一个数据段stack
      inc ax                               ;ax自动加1
      inc ax                               ;ax自动加1
      inc ax                               ;ax自动加1
      mov ax, 4c00h
      int 21h
code ends
end start

答:ax最后等于3
      call基本原理是:
      inc的偏移地址(IP)入站,然后在跳转到从ds:处取来的偏移地址处,这里里面因为站地址已经被ds调用了,所以跳转到的地址是inc第一个,inc一共有三个所以最后ax等于3

(2)下面的程序执行后,ax和bx中的数值为多少?

assume cs:code
data segment
       dw 8 dup (0)
data ends

code segment
start: mov ax, data                            ;把data内存首偏移地址传给ax
         mov ss, ax                               ;把ax中的偏移地址传给栈寄存器ss
         mov sp, 16                              ;把栈的偏移地址指向,第16个字节
         mov word ptr ss:, offset s   ;把标记s处的偏移地址存入内存段地址ss段偏移地址0中,由于调用的是word所以只存标记处s的偏移地址ip(两个字节)
         mov ss:, cs                        ;把当前执行寄存器cs中的地址,付给内存段地址ss段偏移地址是2,由于调用的是cs所以存入内存中的是连个字节
         call dword ptr ss:               ;先把s:mov这行的首地址(段地址,偏移地址)分别压入栈中段地址对应高位EF字节,偏移地址对应CD字节,然后调转到s:mov处,这里有一个nop命令这个该指令是站位符所以越过了他
         nop
         s:mov ax, offset s                  ;把s:mov的首偏移地址直接传给了ax
         sub ax, ss:                      ;用内存地址中ss:的地址减去ax中的数据此处应该是0因为call压入栈中的地址正是s:mov的偏移地址
         mov bx, cs                              ;把执行寄存器cs中的数据传给bx
         sub bx, ss:                      ;用内存地址中ss:的地址减去bx中的数据此处应该是0因为call压入栈中的段地址正是s:mov的cs寄存器中的数据
         mov ax, 4c00h
         int 21h
code ends
end start

答:最后ax和bx数值分别等于0

sannnnnd 发表于 2018-8-26 19:44:23

你这个第二题里面我有个问题:
nop 为什么能够越过他?、
nop也占有一个字节的地址啊。
调试得到的ax=1。

奥普瓯江 发表于 2018-8-27 12:11:50

本帖最后由 奥普瓯江 于 2018-8-27 12:15 编辑

sannnnnd 发表于 2018-8-26 19:44
你这个第二题里面我有个问题:
nop 为什么能够越过他?、
nop也占有一个字节的地址啊。


那个是我错了,那个ax是1,bx是0,nop是占位符,他只是没有可执行的数据,当call执行的时候数据段记录的就是nop的内存地址,所以ax减去(ss:)中的数据得到的是1。

chobits13 发表于 2018-8-27 21:44:11

{:10_266:}看懂了
页: [1]
查看完整版本: 监测点10.5