在x86汇编语言中,是否可以获得寄存器的第一位?我想获得eax寄存器的第一位并将其移入ebx,但我不知道该如何做到这一点.
.stack 2048
.data
ExitProcess proto, exitcode:dword
.code
start:
mov eax, 3;
;now I want to move the first bit of eax into ebx. How can I obtain the first bit from eax?
invoke ExitProcess, 0
end start
Run Code Online (Sandbox Code Playgroud) 我是x86汇编语言的programmig,我发现了一个问题.我调用C函数getch从stdin获取单个字符.但问题是返回值存储在寄存器EAX中.我想知道如何获得一个角色.不是4字节值.谢谢.
我想尽可能地优化我的函数,我做的一件事就是使用r8作为指针,因为这是指针在x64函数中被推入的寄存器.
但是推送RSI或RDI,将指针移动到它们并在循环中更快地使用它们?
例如,mov [RSI],DL;将编译为2个字节和:mov [r8],DL; 将编译为3个字节
所以,如果我做了100到200次循环,r8会因为要解码的额外字节而变慢吗?或推动RSI并移动指针消除任何可能的速度增加?显然push和mov会在循环外发生.
我想知道是否有一种无需使用MUL或DIV指令即可执行任何乘法或除法的方法,因为它们需要大量的CPU周期。我可以针对该目标利用SHL或SHR指令吗?如何实现汇编代码?
我需要特定数字的帮助-我如何bx仅用5个命令就能乘以41?
每当我尝试解决问题时,我至少会得到6条命令...
我的代码:
mov ax,bx
mov cx,bx
shl bx,5 ; *32
shl ax,3 ; *8
add bx,ax ; *40
add bx,cx ; *41
Run Code Online (Sandbox Code Playgroud) 汇编:
.intel_syntax noprefix
.global Foo
Foo:
mov ax, 146
ret
Run Code Online (Sandbox Code Playgroud)
主要.c:
#include <stdio.h>
extern int Foo(void);
int main(int argc, char** args){
printf("Asm returned %d\n", Foo());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我编译并链接:
(compiler name) -c asm.s -o asm.o
(compiler name) asm.o main.c -o main
./main
Run Code Online (Sandbox Code Playgroud)
我正在使用 Windows 和 LLVM 的 x64 windows 二进制文件。
GCC 打印 146(如预期),但 clang 生成的代码打印随机值,为什么?在 Windows 上使用 gdb 调试 clang 二进制文件显然存在一些问题,因此我无法提供任何 gdb 日志。GCC 二进制文件正在执行我期望的操作,但不是 Clang。
x是存储在ebx中的一些整数...如何将4个最高有效位旋转1,同时保留4个最低有效位?其中0xABCDEF12旋转到0xDABCEF12