暂停汇编程序

时间:2013-04-03 23:59:04

标签: assembly interruption

有没有办法暂停程序集中的程序,比如1秒,然后让它恢复正常流程?我正在通过串口编程聊天,但出于某种原因,当我在其中一个程序上键入字符串时,另一个并不总是将其作为单个字符串接收;有时它会将其打印为一个整体,但有时它只显示一个部分,并立即意识到有更多的字符串可以接收并将其打印为第二个字符串。我要做的是将程序停止一秒左右,这样就可以确保它收到整个字符串而不仅仅是它的一部分。

5 个答案:

答案 0 :(得分:2)

对于80x86;如果操作系统类似于MS-DOS或“无”,那么你需要在进行HLT时为了节省功率而在循环中轮询BIOS的“午夜时刻”。要获得“午夜以来的刻度线”,请使用int 0x1Aah=0x00。一秒钟将是大约18个刻度。滚动时要非常小心 - 如果你不小心并在午夜之前做“expiry_time = now + 1秒”那么你可能会永远等待,你应该if(expiry_time >= 0x001800B0) expiry_time -= 0x001800B0来防止这种情况发生。

如果操作系统是现代的(Windows,OS X,Linux,FreeBSD等),那么你想告诉操作系统的调度程序运行其他任务1秒钟(以避免无缘无故地占用CPU时间);并且您要么必须找到适当的(特定于操作系统的)API来执行此操作,要么找到某种类型的库来链接它为您执行此操作。

答案 1 :(得分:2)

我不是回答问题本身,但无论如何:

从不(我的意思是从不!)为这些目标使用时间延迟!这是非常非常非常糟糕的设计。串行端口通信基于字符流。正确设计的程序(无论使用何种语言)必须处理流而不需要任何时间延迟。

答案 2 :(得分:0)

是,

使用GOTO和NOPS。

或创建一个包含nops的循环,并在满足某些条件时将其转义。 或创建一堆GOTO标签

startover
nop
nop
nop
nop
nop
nop
nop
nop
GOTO startover // this wil run forever! you need an escape condition

答案 3 :(得分:0)

是的,你可以得到系统时钟,然后做一个循环来检查你有多少时间过后......

如果您使用的是x86程序集,这可能会有所帮助:https://softwareengineering.stackexchange.com/questions/134084/assembly-instructions-execution-time

或者你可以做一个很长的循环来暂停...第二个我不建议,但它可能适合你的需要

答案 4 :(得分:0)

似乎问题来自缓冲。等待可能是好的,但你必须回答主要问题是"多少次?"。事实上,你真的不知道。 在ASM中,我们使用中断或者等待#34;直到设置了标志"。但只是等待第二次"似乎不是正确的选择(我同意johnfound的100%!)

建议:在发送程序中,缓冲数据直到CR / LF然后发送它们。在接收器上,等待CR / LF显示。 还要看一下串行缓冲区指针(IN和OUT),以查看开始和结束指针的位置,这可能会提供一些信息来解释发生了什么。