10.1补全程序,实现从内存1000:0000处开始执行指令
assume cs:code
stack segment
db 16 dup(0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,16
mov ax,___
push ax
mov ax,____
push ax
retf
code ends
end start
答案:1000h;0 retf相当于:pop IP pop CS 由题目可知,CS=1000,ip=0,那么先放1000h,再放0,出栈的时候就可以满足题意
10.2下面的程序执行后,ax的数值为多少
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 e8 01 00 call s
1000:6 40 inc ax
1000:7 58 s:pop ax
答案:ax=6 解析:call指令先将他后面的的第一个字节的偏移地址,也就是ip,入栈,再转移到标号处,所以出栈的时候,ax=6。
10.3下面的程序执行后,ax中的数值为多少?
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 e8 01 00 call far ptr s
1000:8 40 inc ax
1000:9 58 s:pop ax ---------ax=8
add ax,ax ---------ax=10h
pop bx ---------bx=1000h
add ax,bx --------ax=1010h
答案:
解析:call far ptr s相当于push cs push ip jmp far ptr s
10.4下面的程序执行后,ax中的数值是多少?
内存地址 机器码 汇编指令
1000:0 b8 06 00 mov ax,6
1000:3 ff d0 call ax ------>push 5 jmp [6]
1000:5 40 inc ax
1000:6 mov bp,sp ----->原本ss:sp指向5,现在sp赋给了bp
add ax,[bp] ------->5+6=11=B
答案:000B
10.5下面的程序执行后,ax中的数值为多少?(注意用call指令的原理来分析,不要在debug中单步跟踪结果来验证你的结论)
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:[0EH] ------->将下一条指令的ip地址存入栈,然后jmp到ds:[0EH],那么jmp到哪里去了呢?
inc ax ip存入到了ss:[0EH],而此时,ds:[0EH]里面的值,又要赋给ip,又因为ds=ss
inc ax 那么意思就是,我们push的ip也就是我们要转移的地方,就是下一条指令!
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:[0],offest s ------->ss:[0]存放s标号的偏移地址
mov ss:[2],cs -------->ss[2]存放cs段地址
call dword ptr ss:[0] --------->push cs,push ip,jmp dword ptr ss:[0]
nop 从ss:[0]开始,取出两个字,高位给CS,低位给IP
又因为,ss原本高位放的是CS,低位放的是S标号的偏移地址
所以,相当于 ,转移到下一条指令,nop
s: mov ax,offset s --------->ax=s的偏移地址 ,ss:[0cH]里面存放的是nop的ip地址,则相减,等于1,
sub ax,ss:[0cH]
mov bx,cs
sub bx,ss:[0eH] ------>bx=cs,而ss:[0eh]里面存放的也是cs,所以等于0
mov ax,4c00h
int 21h
code ends
end start
答案:ax==1 bx=0