相关疑难解决方法(0)

与自己对寄存器进行异或的目的是什么?

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

x86 assembly

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

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或?

以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 assembly micro-optimization

109
推荐指数
1
解决办法
4万
查看次数

零分配与xor,第二个真的更快?

有人在几年前向我展示了以下命令将变量归零.

xor i,i
Run Code Online (Sandbox Code Playgroud)

他告诉我,这比为它分配零要快.这是真的吗?编译器是否进行优化以使代码执行此类操作?

assembly compilation

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

如何使用GCC生成最小的BIOS hello world启动扇区,它可以在真实硬件上使用USB记忆棒?

我设法生成一个与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 …

x86 assembly qemu gnu-assembler bare-metal

12
推荐指数
1
解决办法
2402
查看次数