第一题、
MOVSI,2005H;SI先置2005h
MOVAX,1000H
MOVDS,AX;DS置1000h,则开始的时候ds:si=1000h:2005h
MOVCL,05H;计数初值为5
NEXT:MOV[SI],AL
INCAL
INCSI;;;这里SI自加一了,第一次循环,si为2006h(第一次循环在2005h中存入了al的值,然后自加一,也就是si指向的下一个内存),一共循环环了5次,也就是加了五次,所以最后si为200ah;;;;;;;;;
DECCL
JNZNEXT
INT3
这个程序的功能就是:在1000:2005--1000:2009单元中存入00h--04h
第二题、
SI是100ah是我写错了(不好意思)
MOVSB.MOVSB它是把DS:SI所指位址的一个位元组搬移到ES:DI所指的位址上,搬移后原来的内容不变,但是原来ES:DI所指的内容会被覆盖而且在搬移之后SI和DI会自动地指向下一个要搬移的位址.一般而言,通常程序设计师只搬一个字节,通常都会重复很多次,如果要重复的话,就得把重复次数先存储在CX寄存器,并在MOVSB之前加上REP指令
因为cx的值为0ah,所以,搬移次数是10次,搬移十次之后,si为100ah
例如:第一次执行
REPMOVSB
是把ds段中的3000:1000(即31000h)单元中的值,搬移并且覆盖es段中3000:1050单元(即3000:1050单元被赋值55h),然后si,di都指向下一个要搬移的地址,si指向1001,di指向1051
第二次执行
是把ds段中的3000:1001(即31001h)单元中的值,搬移并且覆盖es段中3000:1051单元(即3000:1051单元被赋值55h),然后si,di都指向下一个要搬移的地址,si指向1002(即si=1002),di指向1052
第3.4.次都一样
最终si=100ah,di=105ah31050-----31059单元的都被赋值55h
你也可以用emu8086仿真一下
其实第一题题目我也打错了,嘿嘿,MOVSI,2500HMOVAX,1000HMOVDS,AXMOVCL,05HNEXT:MOV[SI],ALINCALINCSIDECCLJNZNEXTINT3SI就是2505H了,不过,,还有一题答案不是很理解,2.若当前(DS)=2000H,(BX)=1000H,21000H=OFFH,21001H=OFFH程序如下:MOVCL,16MOVAL,[BX]ROLAL,CL执行后(AX)=?,(CF)=?.AX我们有人求的是0FFFFH,能不能解释一下呢!万谢~~!!
你这道题并没有AX原先值,所以AX默认值为0000HMOVCL,16MOVAL,[BX];;这是把ds:[BX]即2000:1000里的值赋到al中,得al=0ffh,但ah中值仍为00h;;;ROLAL,CL;;;rol是不带进位的循环左移,这里一共移动了16次,但只是al头尾之间在移动,并没有移动到ah中,所以ah仍然为00h,移动后,al还是0ffh所以答案是00ffh