我很难理解简单的引导装载程序是如何工作的.我正在谈论的引导加载程序是麻省理工学院"操作系统工程"课程中的一个.
首先,让我向您展示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)
从它的外观来看,此代码设置中断表和描述符表,然后打开保护模式.
转到启动加载程序代码 -
# 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) 我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?
如果我错了,请纠正我.
这是我对JNZ和的理解CMP.
JNZ- 如果Z标志不为零,将发生跳转(1)
CMP- 如果两个值相等,Z则设置标志(1),否则不设置(0)

这是我正在观看的flash教程.它正在教一个简单的CrackMe解决方案.
如您所见,前面的指令AL与之比较47h.他们是平等的,设置了Z旗帜.(你可以在右侧的Registers窗口中看到它)
下一条指令是a JNZ.我的理解是,如果Z设置了标志,将发生跳转.该Z标志设置,但跳就不会发生!
为什么?
如果git fetch被例如Ctrl-C中断或由连接问题引起,那么之后git fetch也git 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.
任何人都可以告诉我纯粹的汇编代码以十进制格式显示寄存器中的值吗?请不要建议使用printf hack,然后使用gcc进行编译.
描述:
好吧,我做了一些研究和NASM的一些实验,并认为我可以使用c库中的printf函数来打印整数.我是通过使用GCC编译器编译目标文件来完成的,所有工作都很公平.
但是,我想要实现的是以十进制形式打印存储在任何寄存器中的值.
我做了一些研究,发现DOS命令行的中断向量021h可以显示字符串和字符,而2或9位于ah寄存器中,数据在dx中.
结论:
我找到的所有示例都没有显示如何在不使用C库的printf的情况下以十进制形式显示寄存器的内容值.有没有人知道如何在装配中这样做?
我一直在为Common Lisp寻找一些好的统计软件包,它应该既稳定又高效.有lhstats,但它没有太多的文档,它目前没有维护.那么Common Lisp中统计编程的首选方式是什么(我使用的是SBCL)?我正在寻找具有高级统计功能的包,例如SEM(结构方程建模),规范相关,GLM(一般线性模型)等,但是甚至非常基本但稳定且记录良好的统计包将是有用的.从Common Lisp调用R统计函数也是一种选择.您有什么推荐的吗?
我目前正在阅读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添加前缀#',可能出现任何问题,是否依赖于实现?
我应该如何if在汇编中写下这样的陈述?
if ((a == b AND a > c) OR c == b) { ...
Run Code Online (Sandbox Code Playgroud)
平台:Intel 32位机器,NASM语法.
更新
对于变量类型和值,请使用更容易理解的内容.我想,整数对我来说会很好.
我一直在尝试熟悉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) 如何0x600860在以下英特尔指令中计算地址?0x4003b8+ 0x2004a2= 60085a,所以我看不出计算是如何进行的.
0x4003b8 <puts@plt>: jmpq *0x2004a2(%rip) # 0x600860 <puts@got.plt>