assume cs:code
code segment
start: mov ax,1
mov cx,3
call s
mov bx,ax ;(bx) = ?
mov ax,4c00h
int 21h
s: add ax,ax
loop s
ret
code ends
end start
------解决方案--------------------------------------------------------
ax,cx分别置1,3。调用s例程,进入s,add ax ax就是ax乘以2倍。又cx为3,所以loop循环3次,总共乘以8倍,ret从s例程返回,跳至mov bx,ax ;(bx) = 8,mov ax,4c00h int 21h中断功能号ah=4c,返回码al=0,中断功能返回dos
------解决方案--------------------------------------------------------
建议你调试一下,这样应该比较快
------解决方案--------------------------------------------------------
1 为什么cx意味着循环次数
因为LOOP指令需要CX,每执行loop一次,就自动减CX 1
2 为什么 返回al
因为需要使用21号中断,所以需要ah和al来传达你的参数,类似调用API那样
3 返回和ret有什么关系呢
call会把下一条指令压栈,而ret则把栈的数据当作地址来跳转
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
- Assembly code
assume cs:codecode segmentstart: mov ax,1 ;ax=1mov cx,3 ;现在CX等于3 call s ;跳转到s标号处mov bx,ax ;(bx) = ? ;把8复制给BX mov ax,4c00h 结束啦... int 21h s: add ax,ax ;call到这里来后ax+ax=2 loop s ;连续循环3次,ax=8,跳到call s的下一条指令retcode endsend start
------解决方案--------------------------------------------------------
晕,你连loop循环都不知道就学call、ret指令,到头来你还是一无所成