+ -
当前位置:首页 → 问答吧 → [分析程序]关于循环队列的几个细节问题

[分析程序]关于循环队列的几个细节问题

时间:2010-11-13

来源:互联网

Assembly code

.model small

.486

.data

show db "I am glad to see you."

range dw 20 ;字符串长度

front dw ?   ;首指针

rear dw ?    ;尾指针

flag db ?  ;为远跳转准备

times db 100   ;循环次数

.code

.startup

  

;功能:把位置加1,并限制在长度为area的循环队列中

;参数:position为当前的位置,area:队列长度

cycle macro position,increase,area     ;这个macro是个宏,怎么去定义的。

       add position,increase

       .if(position>area)

       sub position,area

       dec position   

       .endif

       endm


again:

  mov flag,0

  mov front,0

  mov rear,20

  .repeat    

    mov si,front   

   .repeat      ;此循环为显示从front到rear的字符

    mov ah,02h

    mov dl,show[si]

    int 21h     ;输出show[si]的字符

    cycle si,1,range  ;si加1并使其在循环为rang的队列中

   .until(si==rear)

   mov dl,show[si]

   int 21h

    ;延时程序段

   mov ecx,245678h  ;这个功能号是什么意思?延时时间?

  next:NOP

  loopd next  ;这句是什么含义?时间循环?为什么用loopd?


   ;将光标移到本行前面

   mov ah,03h 

   mov bh,0    

   int 10h  ;读当前光标位置   

   mov dl,0  ;修改光标的列  ;不是mov ah,02h在前,mov dl,0在后吗?

   mov ah,02h

   int 10h  

    ;查找下个显示的开头和结尾

   mov si,front  

  .repeat

    inc si

   .until(show[si]==' '||show[si]=='.')

   .if(show[si]==' ')

   inc si

   mov front,si   ;设置头指针

   dec si  

   mov rear,si    ;设置尾指针

   .endif

.until(show[si]=='.')


jump:

cmp flag,1

je again    ;跳转到目的位置again


dec times 

mov flag,1

cmp times,0

jne jump  ;跳转到比较近的地方

.exit 0

end


作者: kartik   发布时间: 2010-11-13

力所能及的回答你的部分问题:
1、cycle macro position,increase,area ;这个macro是个宏,怎么去定义的。

宏是用macro和endm关键字定义的,macro前为宏名,后面为参数。
2、mov ecx,245678h ;这个功能号是什么意思?延时时间?
这是延时时间,在汇编语言中,通常用ecx做循环长度。
3、 mov dl,0 ;修改光标的列 ;不是mov ah,02h在前,mov dl,0在后吗?
ah和dl之间,谁前谁后对结果没有影响。

作者: asmlearn   发布时间: 2010-11-13