Loops 汇编x86延迟环路
您好,我制作了一个程序,可以旋转两个符号-\和/和/但我不知道如何在嵌套循环中设置cx计数器。有人能给我建议或帮助吗 这是那部分的代码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
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<