Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 汇编x86延迟环路_Loops_Assembly_X86_Delay - Fatal编程技术网

Loops 汇编x86延迟环路

Loops 汇编x86延迟环路,loops,assembly,x86,delay,Loops,Assembly,X86,Delay,您好,我制作了一个程序,可以旋转两个符号-\和/和/但我不知道如何在嵌套循环中设置cx计数器。有人能给我建议或帮助吗 这是那部分的代码 program: mov ah, 0fh ; function - get video mode int 10h push ax ; save number of columns push bx ; save page number mov ah, 0 ; fun

您好,我制作了一个程序,可以旋转两个符号-\和/和/但我不知道如何在嵌套循环中设置cx计数器。有人能给我建议或帮助吗

这是那部分的代码

program:  
      mov ah, 0fh   ; function - get video mode
      int 10h
      push ax       ; save number of columns
      push bx       ; save page number
      mov ah, 0     ; function - set video mode
      int 10h

      mov al, 0003h     ;set video mode
      int 10h

      mov cx,10d  ; Outer loop counter how many symbols rotate

      mov bx,50d  ;   this is for delay loop
      OuterLoop:
      push cx

      mov ah,02h
      mov bh, 0        ;cursor set
      mov dh, 2
      mov dl, 10
      int 10h

      mov AH,0Ah
      mov al,"/"    symbol /
      mov bh,0
      mov cx,1
      int 10h

      mov cx,bx
      call Delay       ;delay loop
      sub bx,15d

      mov ah,02h
      mov bh, 0
      mov dh, 2            cursor set
      mov dl, 10
      int 10h

      mov AH,0Ah
      mov al,"\"             ;symbol \
      mov bh,0 
      mov cx,1
      int 10h


      mov cx,bx
      call Delay  ; another delay
      sub bx,10


      pop cx       ; Restore current CX
      loop OuterLoop

      jmp START     ; and after end it should jump to start where is menu with choices
应该是这样的

写/ 延迟,例如10秒 写\ 延迟8秒 然后跳转到开始和循环

谢谢你的建议

这是我的延迟程序

Delay   PROC    NEAR                    ;

    push    ds                      ;
    push    si                      ;
    push    ax                      ;
    xor     ax, ax                  ;AX = 0
    mov     ds, ax                  ;DS = 0
    mov     si, 046Ch               ;
t1:     mov     ax, [si]                ;
t2:     cmp     ax, [si]                ;
    je      t2                      ;
    loop    t1                      ;
    pop     ax                      ;
    pop     si                      ;
    pop     ds                      ;
    ret                             ;

Delay   ENDP                            ;
我仍然在这个应用程序,但它不工作,我需要的是这个步骤要做

程序:循环的开始 \ 延迟100次 / 延迟80次 环 在每次循环之后,减少延迟,比如100倍于80、60、40等等,但我不知道把推送和弹出cx放在哪里,因为我的延迟过程是与cx一起工作的。例如,我只是将cx设置为100,它会产生延迟等等

我看到两个问题:

首先,
bx
在这里初始化

mov bx,50d  ;   this is for delay loop
但后来它被写下来了

mov bh, 0
bh
bx

其次,在延迟过程中,是什么修改了
[si]
处的位置,从而使
je t2
分支通过?目前,这是一个无限循环:

xor     ax, ax                  ;AX = 0
mov     ds, ax                  ;DS = 0
mov     si, 046Ch               ;
t1:     mov     ax, [si]        ;
t2:     cmp     ax, [si]        ;
        je      t2              ;
        loop    t1              ;
更新: 我发现地址0x46c是一个包含时间信息的BIOS地址

因此,您在该循环中查看的内存是BIOS使用计时器计时(每54.9毫秒计数一次)计数器更新的位置,请参阅

因此,为了回答您的问题,在调用
Delay
过程之前,您应该加载
CX
,其中包含希望延迟的BIOS计时计数(以毫秒为单位的时间除以54.9)。

我发现了两个问题:

首先,
bx
在这里初始化

mov bx,50d  ;   this is for delay loop
但后来它被写下来了

mov bh, 0
bh
bx

其次,在延迟过程中,是什么修改了
[si]
处的位置,从而使
je t2
分支通过?目前,这是一个无限循环:

xor     ax, ax                  ;AX = 0
mov     ds, ax                  ;DS = 0
mov     si, 046Ch               ;
t1:     mov     ax, [si]        ;
t2:     cmp     ax, [si]        ;
        je      t2              ;
        loop    t1              ;
更新: 我发现地址0x46c是一个包含时间信息的BIOS地址

因此,您在该循环中查看的内存是BIOS使用计时器计时(每54.9毫秒计数一次)计数器更新的位置,请参阅


因此,为了回答您的问题,在调用
Delay
过程之前,您应该加载
CX
您希望延迟的BIOS计时计数(以毫秒为单位的时间除以54.9)。

为了绘制我自己的光标,我使用计时器中断,以便在不同性能的CPU上成为更稳定的延迟

Cursor_Speed = 7
;-------------DATA--------------------------------------
          CURFLAG DB 0, 0, 0, 0
          ALTVEC  DD 0
;-------------CODE--------------------------------------
          cli
          xor      ax, ax
          mov      es, ax
          mov      ebx, DWORD PTR es:[8*4] ; Get the old Vector (Offset/Segment)
          mov     DWORD PTR[ALTVEC], ebx   ; save it
          mov     cs:DWORD PTR[OLDVEC], ebx
          mov      es:[8*4], OFFSET NEWVEC ; Set the new IRQ-Vector
          mov      es:[(8*4)+2], cs

          mov      al, 36h                    ; Set 18,2 Hertz(Standard)
          out      43h, al
          xor      al, al
          out      40h, al           ; low
          out      40h, al           ; high
          sti
;---------------------------------------------------
          ......
;---------------------------------------------------
NEWVEC:   inc     BYTE PTR[CURFLAG+1]
          cmp     BYTE PTR[CURFLAG+1], Cursor_Speed
          jb  short NOHIT
          mov     BYTE PTR[CURFLAG+1], 0
          xor     BYTE PTR[CURFLAG], 1

NOHIT:    DB 0EAh                         ; jmp far
OLDVEC    DD 0
;---------------------------------------------------

另外,我们可以等待带有轮询端口3DAh的vsinc变为更小的精度延迟


Dirk

为了绘制我自己的光标,我使用定时器中断,以便在不同性能的CPU上实现更稳定的延迟

Cursor_Speed = 7
;-------------DATA--------------------------------------
          CURFLAG DB 0, 0, 0, 0
          ALTVEC  DD 0
;-------------CODE--------------------------------------
          cli
          xor      ax, ax
          mov      es, ax
          mov      ebx, DWORD PTR es:[8*4] ; Get the old Vector (Offset/Segment)
          mov     DWORD PTR[ALTVEC], ebx   ; save it
          mov     cs:DWORD PTR[OLDVEC], ebx
          mov      es:[8*4], OFFSET NEWVEC ; Set the new IRQ-Vector
          mov      es:[(8*4)+2], cs

          mov      al, 36h                    ; Set 18,2 Hertz(Standard)
          out      43h, al
          xor      al, al
          out      40h, al           ; low
          out      40h, al           ; high
          sti
;---------------------------------------------------
          ......
;---------------------------------------------------
NEWVEC:   inc     BYTE PTR[CURFLAG+1]
          cmp     BYTE PTR[CURFLAG+1], Cursor_Speed
          jb  short NOHIT
          mov     BYTE PTR[CURFLAG+1], 0
          xor     BYTE PTR[CURFLAG], 1

NOHIT:    DB 0EAh                         ; jmp far
OLDVEC    DD 0
;---------------------------------------------------

另外,我们可以等待带有轮询端口3DAh的vsinc变为更小的精度延迟


德克

您希望延迟的精确程度如何?程序是否需要在具有不同CPU时钟速率(GHz)的处理器上延迟相同数量的挂钟时间?不,我不想精确延迟,比如5秒4等等,只是延迟而已。我想写/比延迟,例如10秒,然后再延迟8秒,循环并减少秒数。如果您愿意,我将发布我的延迟过程。继续并发布您的延迟过程。我完成了它。我试着让它一整天都在工作,但仍然没有成功。你希望延迟到什么程度?程序是否需要在具有不同CPU时钟速率(GHz)的处理器上延迟相同数量的挂钟时间?不,我不想精确延迟,比如5秒4等等,只是延迟而已。我想写/比延迟,例如10秒,然后再延迟8秒,循环并减少秒数。如果您愿意,我将发布我的延迟过程。继续并发布您的延迟过程。我完成了它。我试着让它工作一整天,但仍然没有成功我在互联网上发现了延迟程序我不知道它到底是怎么工作的我只知道它工作了,就是这样,它延迟程序当我设置cx时,我需要在光标的一个位置重写符号,所以\重写/起初我想使用backspace,但它不工作,所以我的朋友帮助我完成了设置光标等指令,所以我不知道如何替换它们并避免使用push。现在我知道了如何在不使用push的情况下重写符号。我将使用int 21h,并且我制作了一个新的延迟loopmov bh,0不会过度写入移动到bx中的50h值。这是多余的,但不是有害的。50h存储在bx的位7-0中。OTOH,不能保证int 10h会保留传递的参数值。@Heathunnicutt,你是对的,
BL
BX
的7:0位,因此只要延迟小于14秒,那么
BH
就是零。当所需延迟为14秒时,即14000毫秒,除以54.9毫秒/滴答,即255滴答。。。这是可以存储在
BX
低8位中的最大值。我在互联网上发现了延迟过程我不知道它到底是怎么工作的我只知道它工作了,就是这样,当我设置cx时,它会延迟程序,我需要在光标的一个位置重写符号,所以\重写/起初我想使用backspace,但它不是工作中,我的朋友用设置光标等帮助我完成指令,所以我不知道如何替换它们并避免使用push。现在我知道了如何在不使用push的情况下重写符号。我将使用int 21h,并且我制作了一个新的延迟loopmov bh,0不会过度写入移动到bx中的50h值。这是多余的,但不是有害的。50h存储在bx的位7-0中。OTOH,不能保证int 10h会保留传递的参数值。@Heathunnicutt,你说得对,
BL<