马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 奥普瓯江 于 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:[0EH] ;先把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:[0EH]处取来的偏移地址处,这里里面因为站地址已经被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:[0], offset s ;把标记s处的偏移地址存入内存段地址ss段偏移地址0中,由于调用的是word所以只存标记处s的偏移地址ip(两个字节)
mov ss:[2], cs ;把当前执行寄存器cs中的地址,付给内存段地址ss段偏移地址是2,由于调用的是cs所以存入内存中的是连个字节
call dword ptr ss:[0] ;先把s:mov这行的首地址(段地址,偏移地址)分别压入栈中段地址对应高位EF字节,偏移地址对应CD字节,然后调转到s:mov处,这里有一个nop命令这个该指令是站位符所以越过了他
nop
s:mov ax, offset s ;把s:mov的首偏移地址直接传给了ax
sub ax, ss:[0CH] ;用内存地址中ss:[0CH]的地址减去ax中的数据此处应该是0因为call压入栈中的地址正是s:mov的偏移地址
mov bx, cs ;把执行寄存器cs中的数据传给bx
sub bx, ss:[0eH] ;用内存地址中ss:[0eH]的地址减去bx中的数据此处应该是0因为call压入栈中的段地址正是s:mov的cs寄存器中的数据
mov ax, 4c00h
int 21h
code ends
end start
答:最后ax和bx数值分别等于0 |