例如x86指令:push可以精确地描述为:
push:\nsub esp, data_size\nmov [esp], data\nRun Code Online (Sandbox Code Playgroud)\n\n并且call可以描述为:
call:\npush (eip+2)\njmp addr\nRun Code Online (Sandbox Code Playgroud)\n\n通过了解这些,我们将完全清楚这些指令如何影响堆栈、寄存器和标志,我认为这是至关重要的。
\n\n然而,在阅读《Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册》之后。和“i386程序员手册”我没有找到有关INT指令的确切行为的信息。
\n\n现在,我想在 INT 调用后修改堆栈,使我的程序返回到另一个地方。
\n\n那么,INT被调用之后到底做了什么呢?
\n\n(由程序员或硬件。我听说他们的行为不同)
\n\n提前致谢!!
\n\n\n附:
\n\n据我所知,INT 按某种顺序推送 eip、4 个通用寄存器、eflags 和一些奇怪的东西。
\n\n我观察到当我调用它时它在堆栈上消耗了 6 个字节,
\n\n当硬件触发时,它消耗18个字节。(如时钟)
\n\n补充:我的代码
\n\n\n
\n\n- \n
将 ivt 0x1ch(系统定时器 Tick) 挂钩到我的函数 [foo]
- \n
科学技术
- \n
跳$
- \n
foo: 打印\'A\'
\n …
jmp $我在进入之前检查堆栈foo
我正在尝试在 Cortex-M4 上进入待机模式。正常的行为是设备大约每 2 分钟唤醒一次,但在我最新的固件版本中,代码似乎是“随机”卡住的。
经过调查,代码似乎WFI在没有进入待机状态的情况下传递了指令(无待机 => 无重置 => 无限循环 => ... => 42)。
因此,在阅读了许多不清楚的规范之后,我的理解是,WFI如果存在待处理的中断,则可能不会进入睡眠状态。
WFI?我正在尝试为学校学习汇编,示例代码的开头有这部分:
mov al, 0
mov ah, 5
int 10
Run Code Online (Sandbox Code Playgroud)
在此之前有一个程序:
.386
instructions SEGMENT use16
ASSUME CS:instructions
interrupt_handler PROC
; some code
interrupt_handler ENDP
Run Code Online (Sandbox Code Playgroud)
什么是int 10线在做什么?它是调用interrupt_handler程序吗?为什么正好是10?
这一切都在 DoSBox 中运行,并使用 masm 组装。
我们正在使用 STM32F429I 并尝试通过不同的方式使用定时器(TIM2 和 TIM5)。在我们的代码中启用计时器并调用后;
HAL_TIM_Base_Start_IT(&htim5);
Run Code Online (Sandbox Code Playgroud)
我们可以通过调用TIM5_IRQHandler函数来更新变量。我们注意到HAL_TIM_PeriodElapsedCallback函数已完成相同的过程。
那么我们的问题是:这两个函数有什么区别吗?
我一直在尝试通过按下相应的按钮来让我的 Arduino 上的 LED 亮起和熄灭。
我正在使用中断来实现它并且按钮按下确实被注册,但由于某种原因它没有改变全局变量的值(int button_pressed1,...);
应该发生的是,当我按下按钮 1 时,LED 1 应该亮起和熄灭,与按钮 2 和按钮 3 相同。
我真的很感谢你看一看,中断对我来说很新,所以这可能是一个小问题。<3
*我省略了按钮 2 和 3 的代码。如果我能让 LED 点亮按钮 1,我就能让它们点亮其他按钮。
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#define LED_DDR DDRB
#define LED_PORT PORTB
#define BUTTON_DDR DDRC
#define BUTTON_PORT PORTC
#define BUTTON_PIN PINC
int button_pressed1 = 0; //globale variabele to turn on functions
ISR(PCINT1_vect)
{
if (bit_is_clear(BUTTON_PIN, PC1))
{
_delay_us(500); //debounce
if (bit_is_clear(BUTTON_PIN, PC1))
{
button_pressed1 = 1;
printf("button 1 pressed\n");
}
}
}
int …Run Code Online (Sandbox Code Playgroud) 一般来说,嵌入式设备上硬件中断的ISR应该非常短:通常只需设置一个标志,该标志将在正常执行过程中(例如在任务循环中)被读取。
这就引出了一个问题:如果是这样,成熟的硬件中断和中断控制的目的是什么?为什么MCU不简单地设置一个标志(在指定的寄存器中,内存映射中),同样可以通过任务循环检查该标志?如果我们要做的只是设置一个标志,为什么还要花费实际转移执行的费用(MCU 电路、执行中断和复杂性)?
背景:我的目标是理解。如果答案是“99% 的情况下,你是对的,但只有 1% 的情况下它会产生影响……”,这将实现我的目标。
我有一个简短的问题版本:
counter.start();,counter一个线程在哪里.counter.interrupt()Thread.interrupted().如果它从线程中给出了true我return,那么它就会停止.如果需要,这里有一些细节:
如果您需要更多细节,他们就在这里.从发明调度线程我以这种方式启动一个反线程:
public static void start() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showGUI();
counter.start();
}
});
}
Run Code Online (Sandbox Code Playgroud)
线程的定义如下:
public static Thread counter = new Thread() {
public void run() {
for (int i=4; i>0; i=i-1) {
updateGUI(i,label);
try {Thread.sleep(1000);} catch(InterruptedException e) {};
}
// The time for the partner selection is over.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(partnerSelectionPanel);
frame.add(selectionFinishedPanel);
frame.invalidate();
frame.validate(); …Run Code Online (Sandbox Code Playgroud) 有没有办法检测 go 例程在执行时是否被中断?我想要类似于InterruptedExceptionJava的东西: https ://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html
我正在尝试使用 Turbo-C++ 同时获得鼠标和键盘输入。
我想使用两个函数。第一个函数是main可以接受键盘输入或调用该delay函数dos.h以暂时停止main().
第二个函数处理鼠标输入:
void mouse()
{
union REGS in,out;
in.x.ax=1; // Show mouse pointer
int86(0x33,&in,&out); //interrupt call
while(1)
{
//print the location whenever it changes (not required)
}
}
Run Code Online (Sandbox Code Playgroud) 我练习汇编已经有一段时间了,我在 YouTube 上看到了一个教你如何制作引导加载程序的视频。在观看视频时,我的脑海中出现了“int”是什么的问题。开始搜索,发现是interrupt的缩写。我想到了“什么是中断?”。我再次搜索并开始了解。但是,我很好奇中断是如何产生的,它们是如何产生的?...制造商会自己产生中断吗?或者是什么?
我必须了解我的工作的一个小概念.我必须使用8086使用汇编语言中的DOS中断将存储在寄存器中的值传送到并行端口.以下是需要澄清的微小代码.
[org 0x0100]
mov AL, 01001011 ;any value in AL register that is to be transmitted
(...here...how to transmit it to parallel ports using DOS Interrupt?)
Run Code Online (Sandbox Code Playgroud)