小编Mic*_*tch的帖子

在32位Windows上使用NASM在程序集中创建exe文件

我正在使用32位Windows 7上的NASM以汇编语言编写一个hello world程序.我的代码是:

section .text 
global main ;must be declared for linker (ld) 
main: ;tells linker entry point 
    mov edx,len ;message length 
    mov ecx,msg ;message to write 
    mov ebx,1 ;file descriptor (stdout) 
    mov eax,4 ;system call number (sys_write) 
    int 0x80 ;call kernel 
    mov eax,1 ;system call number (sys_exit) 
    int 0x80 ;call kernel 

section .data 
    msg db 'Hello, world!', 0xa ;our dear string 
    len equ $ - msg ;length of our dear string
Run Code Online (Sandbox Code Playgroud)

我把这个程序保存为hello.asm …

windows x86 assembly linker nasm

5
推荐指数
3
解决办法
1万
查看次数

x86指令编码如何选择操作码

cmpw %ax -5x86-64的编码指令,来自Intel-instruction-set-reference-manual时,我有两个操作码可供选择:

3D iw CMP AX, imm16 I Valid Valid Compare imm16 with AX.
83 /7 ib CMP r/m16, imm8 MI Valid Valid Compare imm8 with r/m16.
Run Code Online (Sandbox Code Playgroud)

所以会有两个编码结果:

66 3d fb ff ; this for opcode 3d
66 83 f8 fb ; this for opcode 83
Run Code Online (Sandbox Code Playgroud)

那么哪一个更好?

我在下面尝试了一些在线反汇编程序

两者都可以反汇编到原点指令.但为什么6683fb00也有效,有效663dfb.

compiler-construction assembly x86-64 disassembly

5
推荐指数
1
解决办法
525
查看次数

放置堆栈并加载内核的位置

我是操作系统开发的新手,我很好奇我在开发自己的bootloader时遇到的问题.我的操作系统将以汇编语言编写,并将以16位实模式运行.

我知道堆栈是什么,我的印象是它向下扩展到内存中.如果我错了,请纠正我.我知道如何从软盘中将基本内核加载到内存中,我不相信这是问题所在.

我遇到的问题是我不确定在哪里放置堆栈并将内核加载到内存中.我试过像这样创建我的堆栈,我遇到了问题:

mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
Run Code Online (Sandbox Code Playgroud)

我正在加载我的内核0x1000:0x0000.当我推送并稍后在我的函数中弹出易失性寄存器时print,我的内核只是第二次挂起call print.这是我的print功能:

print:
    push ax
    push bx
    push cx

    mov al, [si]
    cmp al, 0
    je p_Done

    cmp al, 9
    je p_Tab

    mov ah, 0xE
    int 0x10

    cmp al, 10
    je p_NewLine
   p_Return:
    inc si
    jmp print
  p_Tab:
    xor cx, cx
   p_Tab_Repeat:
    cmp cx, 8
    je p_Return
    mov ah, 0xE
    mov al, " " …
Run Code Online (Sandbox Code Playgroud)

assembly stack real-mode osdev x86-16

5
推荐指数
1
解决办法
230
查看次数

用 32 位 x86 汇编语言清除屏幕的最佳方法是什么(视频模式 13h)

因此,目前我正在将屏幕缓冲区(screenbuffer db 64000 DUP(0))复制到视频内存(从 0a0000h 开始)以清除屏幕。但我想知道像这样再次设置视频模式是否更好:

mov ax, 13h
int 10h
Run Code Online (Sandbox Code Playgroud)

这似乎也清除了屏幕。

或者有没有更好的方法来清除屏幕?

x86 assembly masm real-mode vga

5
推荐指数
1
解决办法
2938
查看次数

Spring Boot:Boot Run无法添加addResources = true

在Kotlin中,在Intellij上使用gradle来运行Spring Boot的任务bootRun,我得到以下错误:

 BUILD FAILED

 Total time: 0.085 secs
 Could not set unknown property 'addResources' for task ':bootRun' 
 of type org.springframework.boot.gradle.tasks.run.BootRun.
Run Code Online (Sandbox Code Playgroud)

我正在使用kotlinVersion ='1.1.4-3',springBootVersion ='2.0.0.M3'而我的bootrun任务在我的gradle.build中看起来如下所示

bootRun
    {
         addResources = true
    }
Run Code Online (Sandbox Code Playgroud)

我的bootRun按预期工作,无需调整bootRun任务

spring gradle kotlin spring-boot

5
推荐指数
1
解决办法
4465
查看次数

在ResponseEntity正文中返回null(Spring Boot RESTful)

我正在使用以下服务创建RESTFul Web服务:

@RequestMapping(value = "/test", produces = "application/json", method = RequestMethod.GET)
public ResponseEntity<List<GenericModel>> returnEmpty() {
    List<GenericModel> genericModelList = new ArrayList<>();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");

    return responseEntity = new ResponseEntity<>(genericModelList, headers, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

当空列表返回时,我在浏览器中得到以下响应:

[]
Run Code Online (Sandbox Code Playgroud)

如何在浏览器中收到“空”响应而不是[]?有某种方法可以告诉Spring将列表大小0呈现为“空”而不是[]?

java rest spring web-services spring-boot

5
推荐指数
1
解决办法
9449
查看次数

在CodeView中单步执行时,EBX的高位被清零

我有以下用MASM为i386处理器编写的简单程序:

        TITLE   BLA
        .MODEL  SMALL
        .386
        .STACK
        .DATA
        .CODE
MAIN    PROC    FAR
        .STARTUP
        MOV     EBX,0FFFFFFFFH; (1)
        MOV     EAX,0EEEEEEEEH; (2)
       .EXIT
MAIN    ENDP
END
Run Code Online (Sandbox Code Playgroud)

我对EBX寄存器的行为感到困惑。在(1)指令之后,EBX设置为1-s:

在此处输入图片说明

执行(2)指令不仅会将值加载到EAX中,而且在EBX的上半部分也为零:

在此处输入图片说明

为什么实际上会发生?

x86 assembly masm code-view x86-16

5
推荐指数
1
解决办法
60
查看次数

如何以编程方式禁用不可屏蔽的中断?

我读过,为了根据英特尔的系统编程指南(第3卷第9.9章)暂时关闭分页,我应该先禁用中断,然后再执行其他操作。我可以使用cli轻松禁用可屏蔽中断,但是所有有关禁用NMI的手册都说

NMI中断可以通过外部电路禁用(软件必须保证在模式切换操作期间不会产生异常或中断。)

我在此OSDEV页面上找到了类似于C代码的用于禁用NMI的代码,但我不太明白它的含义。

void NMI_enable() {
    outb(0x70, inb(0x70) & 0x7F);
 }

 void NMI_disable() {
    outb(0x70, inb(0x70) | 0x80);
 }
Run Code Online (Sandbox Code Playgroud)

感觉代码没有上下文并且在不知道outb和inb函数做什么的情况下是没有意义的。

c x86-64 interrupt osdev nmi

5
推荐指数
2
解决办法
239
查看次数

使用 Turbo C 编译并链接到 .com 文件

我正在尝试使用 Turbo C 编译器和链接器编译一个简单的程序并将其链接到 DOS .com 文件。我尝试了我能想到的最简单的 C 程序。

void main()
{}
Run Code Online (Sandbox Code Playgroud)

Turbo C 链接器中是否有链接到 com 文件的命令行参数?

我从链接器收到的错误消息如下:

“致命:无法生成 COM 文件:入口点地址无效”

我知道 com 文件需要入口点位于 100h。Turbo C 是否有设置此地址的选项?

linker dos memory-model turbo-c x86-16

5
推荐指数
2
解决办法
1823
查看次数

了解预处理器宏中的内联汇编与函数中的内联汇编

GGC的内联汇编可能难以正确实施且容易出错1。从更高层次的角度来看,内联汇编在内联汇编语句可能发出的指令之外必须考虑一些规则。

Ç / C ++标准的考虑asm是定义的选项和实施。在GCC中记录了实现定义的行为,包括以下内容:

即使在使用volatile限定符时,也不要期望asm语句序列在编译后会保持完美连续。如果某些指令需要在输出中保持连续,请将它们放在单个多指令asm语句中。

基本的内联汇编或没有任何输出约束的扩展内联汇编都是隐式的volatile。该文档说,易失性不能保证连续的语句将按源代码中的顺序进行排序。该代码没有保证的顺序:

asm ("cli");
asm ("mov $'M', %%al; out %%al, $0xe9" ::: "eax");
asm ("mov $'D', %%al; out %%al, $0xe9" ::: "eax");
asm ("mov $'P', %%al; out %%al, $0xe9" ::: "eax");
asm ("sti");
Run Code Online (Sandbox Code Playgroud)

如果要使用CLISTI关闭(然后重新打开)外部中断,并按顺序MDP向QEMU调试控制台(端口0xe9)输出一些字母,则不能保证。您可以将它们全部放在单个内联汇编语句中,也可以使用扩展的内联汇编模板将虚拟依赖项传递给每个保证顺序的语句。

为了使事情更易于管理,尤其是众所周知,OS开发人员会围绕此类代码创建方便的包装器。一些开发人员将其用作C预处理器宏。从理论上讲,这看起来很有用:

#define outb(port, value) \
        asm ("out %0, %1" \
             : \
             : "a"((uint8_t)value), "Nd"((uint16_t)port))

#define cli() asm ("cli")

#define sti() asm …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc inline-assembly osdev

5
推荐指数
1
解决办法
121
查看次数