xor eax, eax将永远设置eax为零,对吗?那么,为什么MSVC++有时会把它放在我的可执行代码中呢?这样效率更高mov eax, 0吗?
012B1002 in al,dx
012B1003 push ecx
int i = 5;
012B1004 mov dword ptr [i],5
return 0;
012B100B xor eax,eax
Run Code Online (Sandbox Code Playgroud)
另外,这意味着什么in al, dx?
以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?
xorl %eax, %eax
mov $0, %eax
andl $0, %eax
Run Code Online (Sandbox Code Playgroud) 有人在几年前向我展示了以下命令将变量归零.
xor i,i
Run Code Online (Sandbox Code Playgroud)
他告诉我,这比为它分配零要快.这是真的吗?编译器是否进行优化以使代码执行此类操作?
我设法生成一个与QEMU 2.0.0 Ubuntu 14.04一起使用的最小引导扇区:
.code16
.global _start
_start:
cli
mov $msg, %si
mov $0x0e, %ah
loop:
lodsb
or %al, %al
jz halt
int $0x10
jmp loop
halt:
hlt
msg:
.asciz "hello world"
.org 510
.word 0xaa55
Run Code Online (Sandbox Code Playgroud)
编译:
as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
Run Code Online (Sandbox Code Playgroud)
这个例子可以在这个回购中找到:https://github.com/cirosantilli/x86-bare-metal-examples/tree/2b79ac21df801fbf4619d009411be6b9cd10e6e0/no-ld-script
一旦:
qemu -hda main.img
Run Code Online (Sandbox Code Playgroud)
它hello world按预期在模拟器屏幕上显示.
但是,如果我尝试刻录到USB:
sudo dd if=main.img of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)
然后将USB插入ThinkPad T400或T430,点击F12,然后选择我观察到的USB:
我也用Ubuntu 14.04映像测试了相同的USB,它启动正常,因此USB工作正常.
我应该如何更改此示例,以便它将在硬件上启动并显示hello world消息?
Ubuntu图像和我创建的图像有什么区别?
这记录在哪里?
我已将sudo dmidecodeT400 …