小编Mic*_*tch的帖子

如何修复“错误:无法生成 COM 文件,存在堆栈段”?

我一直试图修复我的代码一段时间,但我似乎无法让它工作。它总是告诉我错误:无法生成 COM 文件,存在堆栈段。有什么想法可以解决这个问题吗?

这是我的代码:

.model small
.386
.stack 100h
.data
     inpM db "Input string: $"
     input db 19              ; max allowed 20
              db ?                ; # char entered
              db 19 dup(0)   ; chars entered
     output db 19 dup("$")
.code
start:    mov ax, @data
            mov ds, ax

            mov ah, 9              ; print inpM
            lea dx, inpM
            int 21h

            mov ah, 0Ah         ; get input
            lea si, input
            mov dx, si
            int 21h

            mov cl, [si+1]        ; reverse
            mov ch, 0
            add …
Run Code Online (Sandbox Code Playgroud)

assembly compiler-errors dos tasm x86-16

0
推荐指数
1
解决办法
2514
查看次数

C中的汇编代码是什么?

我有一些汇编代码,我真的不明白.我的想法是没有意义.不幸的是,我无法提供更多的指导信息.C的输出是什么?

0x1000: iretd   
0x1001: cli 
0x1002: in  eax, dx
0x1003: inc byte ptr [rdi]
0x1005: add byte ptr [rax], al
0x1007: add dword ptr [rbx], eax
0x1009: add byte ptr [rax], al
0x100b: add byte ptr [rdx], 0
0x100e: add byte ptr [rax], al
Run Code Online (Sandbox Code Playgroud)

谢谢

c assembly x86-64 mach-o

0
推荐指数
1
解决办法
309
查看次数

32 位保护模式不适用于多个汇编文件

我正在编写一个简单的 NASM 汇编引导扇区。该代码应在 16 位实模式下将文本打印到屏幕上,然后切换到 32 位保护模式并将文本打印到屏幕上。

我使用 QEMU 作为我的 CPU 模拟器,它按照应有的方式从 16 位模式打印文本。但是,在 32 位模式下应该打印的文本不会打印。

我认为这是我的代码的问题,但我也运行了类似的代码,同样的问题是仅在 16 位模式下工作。

是我没有正确使用 QEMU,还是我弄乱了其他东西?我的代码是:

引导扇区.asm

; Boot sector that enters 32 bit protected mode
[org 0x7c00]

mov bp, 0x9000          ; Set stack
mov sp, bp

mov bx, MSG_REAL_MODE
call print_string

call switch_to_pm       ; We will never return to here

jmp $

%include "print_string.asm"
%include "gdt.asm"
%include "print_string_pm.asm"
%include "switch_to_pm.asm"

[bits 32]
;Where we arrive after switching to PM
BEGIN_PM:
    mov ebx, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly qemu nasm osdev

0
推荐指数
1
解决办法
1231
查看次数

int 10 在汇编中做什么?

我正在尝试为学校学习汇编,示例代码的开头有这部分:

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 组装。

assembly dos interrupt masm x86-16

0
推荐指数
1
解决办法
1353
查看次数

如何在x64中创建thunk?

我找到了很好的示例如何为闭包创建thunk,但它是32位版本:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

struct env {
  int x;
};

struct __attribute__((packed)) thunk {
  unsigned char push;
  struct env * env_addr;
  unsigned char call;
  signed long call_offset;
  unsigned char add_esp[3];
  unsigned char ret;
};

struct thunk default_thunk = {0x68, 0, 0xe8, 0, {0x83, 0xc4, 0x04}, 0xc3};

typedef void (* cfunc)();

struct thunk * make_thunk(struct env * env, void * code)
{
  struct thunk * thunk = (struct thunk *)mmap(0,sizeof(struct thunk), PROT_WRITE | PROT_EXEC, MAP_PRIVATE | …
Run Code Online (Sandbox Code Playgroud)

linux assembly gcc x86-64 32bit-64bit

-1
推荐指数
1
解决办法
465
查看次数

汇编程序中的一对一映射转换

程序集是一种人类可读的语言,但它通常与相应的机器代码具有一对一的关系.因此,据说汇编程序执行同构(一对一映射)转换.

我需要知道汇编程序中一对一映射转换的含义.

compiler-construction assembly

-1
推荐指数
1
解决办法
406
查看次数

如何用鼠标移动光标?

我正在x86汇编中开发一个实模式操作系统。我设法用键盘移动了光标,但我想用鼠标移动了光标。我不知道 我发现int 33h处理鼠标,但是我似乎无法使用int 33h移动光标。

assembly operating-system osdev bootloader x86-16

-1
推荐指数
1
解决办法
167
查看次数

给定一个单链表,将所有奇数节点组合在一起,然后是偶数节点

我遇到了这个问题:

给定一个单链表,将所有奇数节点组合在一起,然后是偶数节点。请注意,这里我们谈论的是节点号,而不是节点中的值。

您应该尝试就地进行。该程序应在O(1)空间复杂度和O(节点)时间复杂度下运行。

例:

Given 1->2->3->4->5->NULL,
return 1->3->5->2->4->NULL.
Run Code Online (Sandbox Code Playgroud)

我已经看到了解决方案,但是我不明白,我需要有人直观地解释问题的解决方案。

这是一个解决方案,但使用Java。我无法想象指针操作,有人可以为我画些什么吗?

public ListNode oddEvenList(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode odd = head;
        ListNode even = head.next;
        ListNode evenHead = even;
        while(odd.next != null && even.next != null){
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
Run Code Online (Sandbox Code Playgroud)

c++ java algorithm linked-list

-2
推荐指数
1
解决办法
1440
查看次数

如何在 Spring Boot 应用程序中将 swagger 集成到 apache cxf jax-rest api 中?

如何在 Spring Boot 应用程序中将 swagger ui 集成到 apache cxf jax-rest api 中?

java spring cxf spring-boot

-2
推荐指数
1
解决办法
2522
查看次数

-2
推荐指数
1
解决办法
447
查看次数

切换到VESA / VBE?

因此,我目前正在使用操作系统,并且处于非常愚蠢的状态:切换到VESA / VBE

我当前的代码:

mov ax, 0x4F02
mov bx, 0x4118
int 0x10
Run Code Online (Sandbox Code Playgroud)

它改变了Qemu分辨率,但是现在我在绘制像素时遇到了问题。像素偏移的公式为:

uint32 pixel_offset = y * pitch + (x * (bpp/8)) + framebuffer;
Run Code Online (Sandbox Code Playgroud)

问题是bpp,pitch和framebuffer应该由

mov ax, 0x4F01
int 0x10
Run Code Online (Sandbox Code Playgroud)

mov ax, 0x4F00
int 0x10
Run Code Online (Sandbox Code Playgroud)

第一,

mov ax, 0x4F00
int 0x10
Run Code Online (Sandbox Code Playgroud)

软锁qemu。即使没有,我该怎么做才能访问该信息。

我想要的是一个功能,该功能可以切换为完全用汇编语言(nasm)编写的VESA / VBE,然后可以使用我的内核编写的函数访问。

编辑:我真的不能在我的引导程序中包含任何C。我需要汇编代码。

x86 assembly nasm osdev vesa

-2
推荐指数
1
解决办法
213
查看次数