小编nrz*_*nrz的帖子

bootloader - 将处理器切换到保护模式

我很难理解简单的引导装载程序是如何工作的.我正在谈论的引导加载程序是麻省理工学院"操作系统工程"课程中的一个.

首先,让我向您展示BIOS执行的一段汇编代码:

[f000:fec3]    0xffec3: lidtw  %cs:0x7908
[f000:fec9]    0xffec9: lgdtw  %cs:0x7948
[f000:fecf]    0xffecf: mov    %cr0,%eax
[f000:fed2]    0xffed2: or     $0x1,%eax
[f000:fed6]    0xffed6: mov    %eax,%cr0
[f000:fed9]    0xffed9: ljmpl  $0x8,$0xffee1
Run Code Online (Sandbox Code Playgroud)

从它的外观来看,此代码设置中断表和描述符表,然后打开保护模式.

  1. 为什么我们在BIOS中进入保护模式?引导程序不应该以实模式运行(顺便说一下 - 为什么它需要在实模式下运行?)
  2. 我搜索但没有找到ljmpl指令的确切工作方式,并且它与ljmp和常规jmp之间的区别 - 如果有人指向正确的方向,我将不胜感激.
  3. 我们为什么要跳跃?这条指令的目的是什么?

转到启动加载程序代码 -

# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt    gdtdesc
movl    %cr0, %eax
orl …
Run Code Online (Sandbox Code Playgroud)

x86 assembly operating-system protected-mode bootloader

27
推荐指数
1
解决办法
9784
查看次数

为什么在x86(-64)上有符号和无符号乘法不同的指令?

我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?

x86 assembly x86-64 twos-complement

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

JNZ和CMP装配说明

如果我错了,请纠正我.

这是我对JNZ和的理解CMP.

JNZ- 如果Z标志不为零,将发生跳转(1)

CMP- 如果两个值相等,Z则设置标志(1),否则不设置(0)

Olly DBG

这是我正在观看的flash教程.它正在教一个简单的CrackMe解决方案.

如您所见,前面的指令AL与之比较47h.他们是平等的,设置了Z旗帜.(你可以在右侧的Registers窗口中看到它)

下一条指令是a JNZ.我的理解是,如果Z设置了标志,将发生跳转.该Z标志设置,但跳就不会发生!

为什么?

x86 assembly reverse-engineering cmp ollydbg

22
推荐指数
2
解决办法
11万
查看次数

如何修复被中断的git fetch破坏的git存储库?

如果git fetch被例如Ctrl-C中断或由连接问题引起,那么之后git fetchgit pull无法工作.

user@computer:~/code/openttd-git$ git fetch
^C
user@computer:~/code/openttd-git$ git fetch
error: Unable to find 22d90742fc79a9011fb86ee03d8aeea66bc12657 under http://git.openttd.org/openttd/trunk.git
Cannot obtain needed object 22d90742fc79a9011fb86ee03d8aeea66bc12657
error: Fetch failed.
Run Code Online (Sandbox Code Playgroud)

我相信这与存储库无关.使用git clone创建这个破碎的本地资源库的拷贝到一个新的本地存储库不解决这个问题.到目前为止,我所知道的唯一解决方案是git clone将整个远程存储库(origin/master)转换为新的本地存储库.但是有没有更好(更快)的解决方案?

Debian的bug报告有最后的消息,从2011年2月这是相同的错误我还是有已经有修补程序或任何解决方案或解决方法呢?我的git版本是1.7.10.

git git-pull git-fetch

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

如何在没有printf的汇编级编程中从c库中打印整数?

任何人都可以告诉我纯粹的汇编代码以十进制格式显示寄存器中的值吗?请不要建议使用printf hack,然后使用gcc进行编译.

描述:

好吧,我做了一些研究和NASM的一些实验,并认为我可以使用c库中的printf函数来打印整数.我是通过使用GCC编译器编译目标文件来完成的,所有工作都很公平.

但是,我想要实现的是以十进制形式打印存储在任何寄存器中的值.

我做了一些研究,发现DOS命令行的中断向量021h可以显示字符串和字符,而2或9位于ah寄存器中,数据在dx中.

结论:

我找到的所有示例都没有显示如何在不使用C库的printf的情况下以十进制形式显示寄存器的内容值.有没有人知道如何在装配中这样做?

x86 assembly nasm cpu-registers

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

Common Lisp的统计软件包

我一直在为Common Lisp寻找一些好的统计软件包,它应该既稳定又高效.有lhstats,但它没有太多的文档,它目前没有维护.那么Common Lisp中统计编程的首选方式是什么(我使用的是SBCL)?我正在寻找具有高级统计功能的包,例如SEM(结构方程建模),规范相关,GLM(一般线性模型)等,但是甚至非常基本但稳定且记录良好的统计包将是有用的.从Common Lisp调用R统计函数也是一种选择.您有什么推荐的吗?

lisp statistics r common-lisp

15
推荐指数
2
解决办法
3200
查看次数

在普通的lisp中编写lambda表达式

我目前正在阅读Paul Graham的ANSI Common Lisp,我有一个关于编写lambda表达式的问题.

我们需要在lambda表达式前加上#'?如果我在REPL中写这样的东西,它会正常工作

> ((lambda (x) (+ x 1)) 1)
  2
Run Code Online (Sandbox Code Playgroud)

这样也会

> (mapcar (lambda (x) (+ x x)) '(1 2 3 4))
  (2 4 6 8)
Run Code Online (Sandbox Code Playgroud)

我明白这#'表示一个功能.所以我的问题是,它是某种惯例还是推荐的做法?如果我不为lambdas添加前缀#',可能出现任何问题,是否依赖于实现?

lambda clisp common-lisp

15
推荐指数
1
解决办法
7579
查看次数

汇编中的复杂IF语句

我应该如何if在汇编中写下这样的陈述?

if ((a == b AND a > c) OR c == b) { ...
Run Code Online (Sandbox Code Playgroud)

平台:Intel 32位机器,NASM语法.

更新

对于变量类型和值,请使用更容易理解的内容.我想,整数对我来说会很好.

x86 assembly conditional-statements

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

在Mac上汇编和在linux上汇编有什么区别?

我一直在尝试熟悉mac上的汇编,从我所知道的,文档非常稀疏,大多数关于这个主题的书都是针对windows或linux的.我以为我可以很容易地从linux转换到mac,但这个(linux)

.file   "simple.c"
.text
.globl simple
.type   simple, @function
simple:
      pushl   %ebp
      movl    %esp, %ebp
      movl    8(%ebp), %edx
      movl    12(%ebp), %eax
      addl    (%edx), %eax
      movl    %eax, (%edx)
      popl    %ebp
      ret
.size   simple, .-simple
.ident  "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
.section        .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

看起来与此非常不同(mac)

.section    __TEXT,__text,regular,pure_instructions
.globl  _simple
.align  4, 0x90
_simple:                                ## @simple
    .cfi_startproc
## BB#0:
pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    addl    (%rdi), %esi
    movl    %esi, (%rdi)
    movl    %esi, %eax
    popq    %rbp …
Run Code Online (Sandbox Code Playgroud)

macos x86 assembly gcc x86-64

14
推荐指数
1
解决办法
3697
查看次数

这个英特尔jmpq指令有什么作用?

如何0x600860在以下英特尔指令中计算地址?0x4003b8+ 0x2004a2= 60085a,所以我看不出计算是如何进行的.

0x4003b8 <puts@plt>: jmpq *0x2004a2(%rip) # 0x600860 <puts@got.plt>

assembly gdb x86-64

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