小编Mic*_*tch的帖子

为什么objdump为这个汇编语言指令显示一个空操作码?

我有以下汇编代码:

global _start
section .text
_start:

add byte [eax], al
Run Code Online (Sandbox Code Playgroud)

编译和链接后,我尝试看到操作码:

$ objdump -d eax.o

eax.o:     file format elf32-i386


Disassembly of section .text:

00000000 <_start>:
        ...
$
Run Code Online (Sandbox Code Playgroud)

为什么我得到一个空操作码?

x86 assembly opcode objdump disassembly

4
推荐指数
1
解决办法
398
查看次数

x86_64:我可以更改EFLAGS寄存器中的VM标志吗?

我可以更改EFLAGS寄存器中的VM标志吗?如果是这样,怎么样?

请注意,我不能只使用pushf,操纵堆栈上的值,然后popf.根据英特尔手册:

第2卷,第4.3章PUSHF:

"将整个EFLAGS寄存器复制到堆栈时,不会复制VM和RF标志(位16和17);而是在存储在堆栈中的EFLAGS映像中清除这些标志的值."

第2卷,第4.3章POPF:

"在特权级别0(或实地址模式,相当于特权级别0)的受保护,兼容性或64位模式下运行时,EFLAGS寄存器中的所有非保留标志(RF1,VIP,VIF除外) ,VM可能会被修改.VIP,VIF和VM不受影响."

assembly x86-64 virtual-machine

4
推荐指数
1
解决办法
572
查看次数

BIOS磁盘 - 将扇区读入内存(int 0x13,ah = 0x02)阻塞

我正在编写MBR并使用QEMU进行测试.

当将读取扇区用于内存(int 0x13, ah=0x02)时,该int指令似乎阻止了我的程序的执行,并且它继续挂起.我已经用各种打印语句对此进行了测试,以确认这是特定的指令阻塞.

什么可以使中断阻止?我认为这只能通过cli指令完成,即使这样也不会阻止int指令.


对于上下文,这是导致阻塞中断的代码read_sectors_16:

        [bits 16]        
        [ORG 0x7C00]
        jmp 0x000:start_16      ; ensure cs == 0x0000

        reset_failure_str db 'error: boot disk reset', 13, 10, 0
        read_failure_str db 'error: boot disk read', 13, 10, 0
        boot_segaddr dw 0x7E00

        read_attempt_str db 'read attempt', 13, 10, 0
        end_read_attempt_str db 'end read attempt', 13, 10, 0

start_16:
        ;; Initialize segment registers
        mov ax, cs
        mov ds, ax
        mov es, …
Run Code Online (Sandbox Code Playgroud)

x86 mbr qemu osdev bootloader

4
推荐指数
1
解决办法
882
查看次数

如何在 Spring Security 过滤器之后添加自定义过滤器顺序?

我的过滤器如下:

@Component
@Order(1)
public class MDCFilter implements Filter {
.....
Run Code Online (Sandbox Code Playgroud)

和应用程序属性

security.filter-order=0
Run Code Online (Sandbox Code Playgroud)

在上面的设置中 - 我的过滤器首先出现,然后是安全过滤器。但我在 Spring Security 过滤器之后需要 mdcFilter 。

security spring filter spring-boot

4
推荐指数
1
解决办法
7469
查看次数

Spring Boot嵌入式tomcat应用程序会话不会失效

最近,我们将应用程序从在tomcat中运行的Web应用程序移植到了具有嵌入式tomcat的spring boot应用程序。

在运行该应用程序几天后,内存和CPU使用率已达到100%。在堆转储分析中,发现有一堆未删除的http会话对象。

我可以在调试中看到使用配置的超时值创建的会话(比如说5分钟)。但是在此时间之后,无效不会触发。仅当我在超时时间段后再次请求时才调用它。

我已经将此行为与在Tomcat中运行的应用进行了比较,并且可以看到会话无效是由ContainerBackgroungProcessor线程[StandardManager(ManagerBase).processExpires()]触发的

我在Spring Boot应用程序中看不到该后台线程。

根据发现的一些建议进行了什么操作:

  1. 在application.properties:server.session.timout = 300或EmbeddedServletContainerCustomizer @Bean中设置的会话超时:factory.setSessionTimout(5,TimeUnit.MINUTES)

  2. 添加了HttpSessionEventPublisher和SessionRegistry bean

没有任何帮助,会话不会在到期时失效。

关于这个的一些线索?

session spring tomcat spring-boot

4
推荐指数
1
解决办法
1239
查看次数

将16位实模式代码链接到符合Multiboot的ELF可执行文件时出现LD错误

我正在编写一个包含我的32位内核的Multiboot兼容的ELF可执行文件.我的主要问题是我在生成可执行文件时收到一系列链接器错误:

重定位被截断以适合:R_386_16对``.text'

链接器脚本,代码和构建脚本如下

我决定尝试在我的操作系统中实现VESA VBE图形.我在OSDev论坛中发现了一个现有的VESA驱动程序,我试图将它集成到我自己的操作系统中.我尝试将它添加到我的源目录,用NASM组装并将其链接到LD的最终可执行文件中.我收到的具体错误是:

vesa.asm:(.text+0x64): relocation truncated to fit: R_386_16 against `.text'
obj/vesa.o: In function `svga_mode':
vesa.asm:(.text+0x9d): relocation truncated to fit: R_386_16 against `.text'
vesa.asm:(.text+0xb5): relocation truncated to fit: R_386_16 against `.text'
obj/vesa.o: In function `done':
vesa.asm:(.text+0xc7): relocation truncated to fit: R_386_16 against `.text'
Run Code Online (Sandbox Code Playgroud)

导致错误的行(按顺序)如下:

mov ax,[vid_mode]
mov cx,[vid_mode]
mov bx,[vid_mode]
jmp 0x8:pm1
Run Code Online (Sandbox Code Playgroud)

我还评论了"链接器错误"的行

这是文件(vesa.asm):

BITS    32

global do_vbe

save_idt: dd 0
          dw 0
save_esp: dd 0
vid_mode: dw 0

do_vbe: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm ld osdev

4
推荐指数
1
解决办法
946
查看次数

如何在MOV和LEA指令后确定AX中的结果

我想在下面的问题中了解AX寄存器的内容,我不明白我怎么知道示例中的[5000h]或[DI]是什么.

寄存器和存储器的状态定义为:

CS=3000 [53000]=BBBB [33000]=6666 [13000]=1111
DS=1000 [54000]=CCCC [34000]=7777 [14000]=2222
SS=5000 [55000]=DDDD [35000]=8888 [15000]=3333
DI=7000 [56000]=EEEE [36000]=9999 [16000]=4444
BP=4000 [57000]=FFFF [37000]=AAAA [17000]=5555
Run Code Online (Sandbox Code Playgroud)

AX中的每个指令的值是多少

  • MOV AX, [DI]
  • MOV AX, [5000h]
  • MOV AX, [BP+2000h]
  • LEA AX, [BP+1000h]

x86 assembly real-mode x86-16

4
推荐指数
1
解决办法
135
查看次数

ASM:“ mov”的内存引用过多

还是我,我的idt.S文件(使用gcc编译的Intel语法)出现了新问题。当我尝试编译以下代码时:

load_idt:
        mov edx, (esp + 4) ; On this line
        lidt (edx)
        sti
        ret
Run Code Online (Sandbox Code Playgroud)

我收到一个我真的不知道如何解决的错误:

Error: too many memory references for `mov'
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc osdev intel-syntax

4
推荐指数
1
解决办法
492
查看次数

为什么从 x86_64 汇编函数调用 C abort() 函数会导致分段错误 (SIGSEGV) 而不是中止信号?

考虑该程序:

主程序

#include <stdlib.h>

void my_asm_func(void);
__asm__(
    ".global my_asm_func;"
    "my_asm_func:;"
    "call abort;"
    "ret;"
);

int main(int argc, char **argv) {
    if (argv[1][0] == '0') {
        abort();
    } else if (argv[1][0] == '1') {
        __asm__("call abort");
    } else {
        my_asm_func();
    }
}
Run Code Online (Sandbox Code Playgroud)

我编译为:

gcc -ggdb3 -O0 -o main.out main.c
Run Code Online (Sandbox Code Playgroud)

然后我有:

$ ./main.out 0; echo $?
Aborted (core dumped)
134
$ ./main.out 1; echo $?
Aborted (core dumped)
134
$ ./main.out 2; echo $?
Segmentation fault (core dumped)
139
Run Code Online (Sandbox Code Playgroud)

为什么我只在最后一次运行时收到分段错误,而不是预期的中止信号?

man 7 …

linux x86 gcc x86-64 inline-assembly

4
推荐指数
1
解决办法
1302
查看次数

如何在 MASM 程序集中初始化本地结构

我想初始化堆栈上的本地结构。

Records         STRUCT
data1           DWORD   ?
data2           DWORD   ?
data3           DWORD   ?
data4           DWORD   ?
Records         ENDS

                .CODE
main:
                mov     ebp, esp
                sub     esp, SIZEOF Records
Run Code Online (Sandbox Code Playgroud)

如何创建一个命名实例,struct Records然后用它来初始化数据成员?我想将该struct指令与点运算符一起使用,而不是指针加法。

我一开始为结构体分配了空间,那么我应该做什么呢?

x86 assembly struct masm

4
推荐指数
1
解决办法
3384
查看次数