我一直试图修复我的代码一段时间,但我似乎无法让它工作。它总是告诉我错误:无法生成 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) 我有一些汇编代码,我真的不明白.我的想法是没有意义.不幸的是,我无法提供更多的指导信息.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)
谢谢
我正在编写一个简单的 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) 我正在尝试为学校学习汇编,示例代码的开头有这部分:
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 组装。
我找到了很好的示例如何为闭包创建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) 程序集是一种人类可读的语言,但它通常与相应的机器代码具有一对一的关系.因此,据说汇编程序执行同构(一对一映射)转换.
我需要知道汇编程序中一对一映射转换的含义.
我正在x86汇编中开发一个实模式操作系统。我设法用键盘移动了光标,但我想用鼠标移动了光标。我不知道 我发现int 33h处理鼠标,但是我似乎无法使用int 33h移动光标。
我遇到了这个问题:
给定一个单链表,将所有奇数节点组合在一起,然后是偶数节点。请注意,这里我们谈论的是节点号,而不是节点中的值。
您应该尝试就地进行。该程序应在O(1)空间复杂度和O(节点)时间复杂度下运行。
例:
Run Code Online (Sandbox Code Playgroud)Given 1->2->3->4->5->NULL, return 1->3->5->2->4->NULL.
我已经看到了解决方案,但是我不明白,我需要有人直观地解释问题的解决方案。
这是一个解决方案,但使用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) 如何在 Spring Boot 应用程序中将 swagger ui 集成到 apache cxf jax-rest api 中?
因此,我目前正在使用操作系统,并且处于非常愚蠢的状态:切换到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。我需要汇编代码。