小编sar*_*hak的帖子

x86中内存分段的混乱

在这里,我制作了一个代码,用于将ASCII字符写入VGA内存:

.global _put_in_mem
_put_in_mem:
push bp
mov bp, sp
mov cx, [bp + 4]
mov si, [bp + 6]
mov bx, 0xb800
mov ds, bx
mov [si], cx
add bx, 0x1
mov cx, 0x7
mov [si], cx
pop bp
ret
Run Code Online (Sandbox Code Playgroud)

这是通过如下所示的kernel.c文件调用的:

void main()
{
 extern void put_in_mem();
 char c = 'e';
 put_in_mem(c, 0xA0);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是为了在QEmu的第二行开头打印"e",但事实并非如此.我尝试使用GDB调试这个并找到该命令

mov bx, 0xb800
Run Code Online (Sandbox Code Playgroud)

在GDB中已成为

mov    -0x4800,%bx
Run Code Online (Sandbox Code Playgroud)

此命令后的ebx中的值为0x0.
为什么没有在bx寄存器中加载该值?

此外,我认为移动指令使用ds寄存器作为其段基,并从ds的内容中偏移所有地址.所以根据这个推理,我假设什么时候

mov [si], cx
Run Code Online (Sandbox Code Playgroud)

指令cx寄存器的内容将放在地址0xb8a0.它是否正确?mov指令是否也会受到任何其他segement寄存器(如cs,es等)的影响?

c x86 assembly

6
推荐指数
1
解决办法
274
查看次数

如何在16位模式下使用GDB?

我有以下代码,我试图实现一个使用BIOS函数打印字符串的函数:

int printString(char* string)
{
 int i = 0;
 while (*(string + i) != '\0')
   {
    char al = *(string + i);
    char ah = 0xe;
    int ax = ah * 256 + al;
    interrupt(0x10,ax,0,0,0);
    i++;
   }
 return i;
}
Run Code Online (Sandbox Code Playgroud)

函数中断在汇编中实现.它调用适当的BIOS中断,如第一个参数所给出的,其余参数分别包含ax,bx,cx和dx寄存器的内容:

.global _interrupt
_interrupt:
push bp
mov bp, sp
push si
push ds
mov ax, #0x100
mov ds, ax
mov ax, [bp + 0x4]
mov si, #intr
mov [si + 1], al
pop ds
mov ax, [bp + 0x6]
mov …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gdb

4
推荐指数
2
解决办法
2879
查看次数

x86汇编代码的语法

我试图了解操作系统的基础知识,并在OCW中找到了一门课程(名为6.828).我在课程的实验中找到了bootloader的代码,我试过但不理解代码的以下部分:

# Enable A20:

#   For backwards compatibility with the earliest PCs, physical

#   address line 20 is tied low, so that addresses higher than

#   1MB wrap around to zero by default.  This code undoes this.

seta20.1:
inb     $0x64,%al               # Wait for not busy
testb   $0x2,%al
jnz     seta20.1

movb    $0xd1,%al               # 0xd1 -> port 0x64
outb    %al,$0x64

seta20.2:
inb     $0x64,%al               # Wait for not busy
testb   $0x2,%al
jnz     seta20.2

movb    $0xdf,%al               # 0xdf -> port 0x60
outb    %al,$0x60
Run Code Online (Sandbox Code Playgroud)

我们如何检查端口0x64是否忙,以及为什么该端口用于启用A20位?为了使芯片运行到32位模式,GDT的配置如下: …

x86 assembly operating-system

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

无法从 QEmu 中的磁盘读取

我尝试使用 QEmu 从磁盘读取以下代码:

; Read some sectors from the boot disk using our disk_read function
[org 0x7c00]
mov [BOOT_DRIVE] , dl 
; BIOS stores our boot drive in DL , so store this for later
mov bp , 0x8000
mov sp , bp
; Here we set our stack safely out of the
; way , at 0x8000
mov bx , 0x9000
; Load 5 sectors to 0 x0000 ( ES ):0 x9000 ( BX )
mov dh , 5 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gdb qemu

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

Python:为什么readline()函数不适用于文件循环

我有以下代码:

#!/usr/bin/python

f = open('file','r')

for line in f:
    print line 
    print 'Next line ', f.readline()
f.close()
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

This is the first line

Next line
That was the first line
Next line
Run Code Online (Sandbox Code Playgroud)

为什么readline()函数在循环中不起作用?它不应该打印文件的下一行吗?
我使用以下文件作为输入

This is the first line
That was the first line
Run Code Online (Sandbox Code Playgroud)

python

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

为什么这个具有相同类的实例变量的类会导致StackOverflowError,而类似的类与相同类型的静态变量不相同?

我的问题与另一个问题有关:如何在类本身内部创建类的实例?

我创建了两个类,如下所示:

class Test {
  Test buggy = new Test();
  public static void main (String[] args) {
    Test test = new Test();
    System.out.println("Done");
  }
}
Run Code Online (Sandbox Code Playgroud)

而另一个:

class Test {
  static Test buggy = new Test();
  public static void main (String[] args) {
    Test test = new Test();
    System.out.println("Done");
  }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第一个代码(没有静态变量)给出了堆栈溢出错误但是当我声明实例变量是静态的(第二种情况)时我没有错误.static关键字在这里有什么区别?

java

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

标签 统计

assembly ×4

x86 ×4

c ×2

gdb ×2

java ×1

operating-system ×1

python ×1

qemu ×1