当前位置: 代码迷 >> 汇编语言 >> 哪位高手细致解释下面约10行代码啊(含call和ret),感谢感谢啊又要通宵奋战这10行代码了,求你细致点分析下
  详细解决方案

哪位高手细致解释下面约10行代码啊(含call和ret),感谢感谢啊又要通宵奋战这10行代码了,求你细致点分析下

热度:5672   发布时间:2013-02-26 00:00:00.0
谁细致解释下面约10行代码啊(含call和ret),感谢感谢啊,又要通宵奋战这10行代码了,求你细致点分析下
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则把栈的数据当作地址来跳转
------解决方案--------------------------------------------------------
探讨

引用:
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

我想问3个问题:
1 为什么cx意味着循环次数
2 ……

------解决方案--------------------------------------------------------
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指令,到头来你还是一无所成
  相关解决方案