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,1000
Push ax
Mov ax,0
Push ax
Retf
Code ends
End start
第一个空:Mov ax,1000
第二个空:Mov ax, 0
Retf指令先pop IP 在 pop cs.现将段地址压入栈中,然后将偏移地址压入栈中。
10.2
AX=6
执行call s时会把call指令的下一条指令的偏移地址压入堆栈,下一条指令是inc ax ,它的偏移地址是6,而执行完call指令后会跳到s:pop ax ,即把堆栈里的数据出栈到ax里,此时堆栈里的数据是6,故ax里的数值是6.
10.3
ax=1010h.
首先我们知道执行第一句的时候IP是0003,然后(IP)=(IP)+3,执行call语句,现将cs入栈(CS=1000h),再将IP入栈,执行这句后,IP句改为0008h,然后跳到s标号处执行,pop ax(ax=0008h) add ax,ax(ax=0010h) pop bx(bx=1000h) add ax,bx(ax=1010h)最后ax=1010h.
10.4
AX=0006
执行到call指令时,将1000:5中的数据压入栈中,接着执行mov语句,ss:sp处的数据为压入栈中的数据0005.执行add ax,[bp]这句,ax=ax+0005=0006.
10.5
(1)AX=3
执行到mov ax, 由于call语句call word ptr ds:[0EH]改变了stack中的最后两个字节的单位地址为IP值,此IP值为16(10进制),刚好jmp word ptr IP为下一个指令:inc ax,0执行3次Inc ax语句后,ax为3.
(2)AX=1,BX=0;
在栈中是从高位向地位存储的,所以是从16-》8位依次存储的是offset s、cs、cs、ip,那么sub ax,ss:[0ch],就是用offeset s与call dword ptr ss:[0]相减,结果为1,同理bx是两个cs相减为零
- [zhenglxd] 正确 挺可惜的 你们十堰职业技术学院学生 最终能坚持下来的也就2,3个,好像你的进度是最快的! 06/16 15:50
- [tomato] 正确。 06/15 14:35
- [tomato] 正确。 06/12 09:18
- [十堰职业技术学院学生211037] 谢谢whos 提出的错误,自己检查了一下,最后得出的结果是: Add al ,90h cf= 05/23 19:57
- [十堰职业技术学院学生211037] 谢谢,是我自己理解的时候出错。 正确的做法是: (1) Mov ax,0f000h Mov 05/22 17:51
- [游客] 回答OK。 05/22 08:10
- [游客] jb是小于,jnb是不小于(即大于或等于)。根据这个解释,你的两个题目是有问题的。[]是闭区间,() 05/22 08:09
- [tomato] 正确。 05/19 12:34
- [whos] Add al,90H CF=0 OF=0 SF=0 ZF=0 PF= 05/17 12:15
- [mess] 正确,博主继续加油啊^_^ 05/11 18:41
- [游客] 为啥没有报名学习活动呢?那样你的博客里就有专门提交作业的地方了。 03/26 20:51
[ fangyugirl 发表于 2009-05-11 08:38 ]
我是十堰的,我家在太和医院旁边一点,离你们学校也挺近的噢。
[ mess 发表于 2009-05-11 18:40 ]
10.4
AX=0006
-------------
error
第一个空:Mov ax,1000
---------------
注意是十六进制要加H,要不默认是十进制就错误了。