Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 暂停汇编程序_Assembly_Interruption - Fatal编程技术网

Assembly 暂停汇编程序

Assembly 暂停汇编程序,assembly,interruption,Assembly,Interruption,有没有办法在汇编程序中暂停一个程序,比如说1秒钟,然后让它恢复正常的流程?我正在通过串口编程聊天,但由于某种原因,当我在其中一个程序上键入字符串时,另一个程序并不总是将其作为单个字符串接收;有时它将其作为一个整体打印,但有时它仅显示一部分,并立即意识到有更多字符串需要接收,并将其作为第二个字符串打印。我要做的是让程序停止一秒钟左右,这样它就可以确保接收到整个字符串,而不仅仅是其中的一部分。是 使用GOTO和NOPS 或者创建一个循环来解决nops,并在满足特定条件时将其转义。 或者创建一个GOT

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

使用GOTO和NOPS

或者创建一个循环来解决nops,并在满足特定条件时将其转义。 或者创建一个GOTO标签一堆nop

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

是的,你可以得到系统时钟,然后做一个循环来检查在你得到时间后是否已经过了一秒钟

如果您使用的是x86程序集,这可能会有所帮助:


或者你可以做一个很长的循环来暂停。。。第二个我不太推荐,但它可能适合80x86的需要;如果操作系统类似于MS-DOS或“无”,那么在执行HLT(节省电源)时,您可能希望在循环中轮询BIOS的“自午夜以来的滴答声”。要获取“午夜以来的滴答声”,请使用
int 0x1A
ah=0x00
。一秒钟大约是18个滴答声。在翻车时要非常小心-如果你不小心,在午夜前执行“到期时间=现在+1秒”,那么你可能会一直等待,你应该执行
如果(到期时间>=0x001800B0)到期时间-=0x001800B0
来防止这种情况发生


如果操作系统是现代的(Windows、OS X、Linux、FreeBSD等),那么您需要告诉操作系统的调度程序运行其他任务1秒(以避免无故占用CPU时间);您必须找到合适的(特定于操作系统的)API来实现这一点,或者找到某种库来进行链接,以便为您实现这一点

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


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

问题似乎来自缓冲。等待可能很好,但你必须回答一个主要问题,那就是“多少次?”。事实上,你并不知道。 仅在ASM中,我们使用中断或等待“直到设置标志”。但仅仅“等待一秒钟”似乎不是正确的选择(我100%同意johnfound!)

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

每个CPU至少有一种汇编语言(通常一个CPU有两种或两种以上不同的汇编语言,例如Intel syntax vs.at&T)。因为问题并没有说哪种汇编语言适合哪种CPU,“伪汇编”是个好主意
GOTO
不是汇编,但是
GOTO
存在于许多语言中,并且被广泛理解,这使得它成为“伪汇编”的一个有吸引力的选项。我不理解的是nop,我想它除了浪费时间之外并没有做任何事情。
nop
代表:“无操作”。它通常是为了可读性而使用的;主要是因为它什么都不做(字面上),但是它确实会消耗时间,因此可以用来延迟程序…在这种情况下,您不能使用NOP。因为NOP需要时钟周期,但您不知道有多少(取决于Proc),也不知道一个周期持续多长(取决于Proc频率)。如果你必须等待,例如“2秒”,你必须在系统中找到一个时钟计时器并依靠它。如果你做得对,你应该得到一个字节流,只有当你收到某种“消息结束”字节(例如换行符)时才会显示,你不应该需要暂停开始。暂停1秒无法解决问题。请指定CPU和操作系统。答案将取决于这些因素。事实上,请对所有[assembly]问题执行相同的操作。修复您的聊天协议,以便在作为字节流接收时可以识别字符串的开始/结束,不是更容易吗?定时器信号不能可靠地工作,或者引入令人讨厌的延迟,或者两者兼而有之。+1(我曾经用这种技术为80386制作了一个红外发射器。)微秒分辨率间隔不必担心溢出。我在等待1个滴答声(大约55毫秒)时尝试了这一方法,但效果很好,我的所有字符串都不再被分割接收