x86-64 相关问题

x86-64是Intel x86架构的64位扩展

IM制作一个非常简单且基本的组装程序(以0到15创建数组,找到质数,每个数字平方并在每个数字中进行斐波那契)。但是每次我运行时,我都会得到一个细分

section .data array_int db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 section .bss ; alocar espaços vazios de memoria primos resb 16 potencias resw 16 fib_results resw 16 ; serão usados registradores de 16 bits para fibonacci section .text global _start e_primo: cmp al, 2 jl nao_primo ; menor que 2 não é primo je sim_primo ; 2 é primo test al, 1 ; AND entre bits menos significat. Pares sempre comecam com 0. Pares não são primos jz nao_primo mov cl, 3 ; após inicializar primeiro divisor, "JUMP" pra checa_div checa_div: mov bl, al ; mov al, cl ; porque o AL é um registrador q tem q ser usado em MUL mul al ; AL por ele mesmo cmp al, bl ; checa se ja passou da sqrt do num: todos necessarios ja foram checados jg sim_primo mov al, bl mov ah, 0 ; zera registrador q armazena resto div cl cmp ah, 0 je nao_primo add cl, 2 ; queremos checar apenas impares mov al, bl ; valor em AL é alterado na divisao jmp checa_div nao_primo: mov al, 0 ret sim_primo: mov al, 1 ret start_fibo: mov dx, 0 cmp al, 0 je end_fibo mov dx, 1 cmp al, 1 je end_fibo ; fibo 0 e 1 é eles mesmos mov bx, 0 mov dx, 1 mov cx, ax ; cx é usado no loop (AX vezes) sub cx, 1 ; primeiro ja tratado fib_loop: mov ax, dx ; salva f(n) em ax add dx, bx ; dx = f(n) + f(n - 1) = f(n + 1) mov bx, ax ; f(n) loop fib_loop end_fibo: mov ax, dx ret _start: lea rsi, [array_int] lea rdi, [primos] lea rdx, [potencias] lea r15, [fib_results] mov rcx, 16 loop_array: mov al, [rsi] call e_primo mov[rdi], al movzx ax, byte [rsi] ; restaura AL (registrador de 16 agora) mul al ; potencia do valor em AL mov [rdx], ax movzx ax, byte [rsi] call start_fibo mov [r15], ax inc rsi inc rdi add rdx, 2 add r15, 2 loop loop_array mov rax, 60 xor rdi, rdi syscall

回答 1 投票 0

我正在做的剥削是:

I发现了包含重要小工具的这两个功能:

回答 1 投票 0

使用mingw-w64? 我刚刚开始学习从C ++移动的C,我只是在尝试大量可变类型。我正在与GCC编译器一起使用MingGW-W64工具集。据说此版本使用ucrt运行时i ...

,因为“ Math.h”似乎没有定义M_PI。将其投入双重似乎可以返回正确的值,但是长的双值非常小。这是怎么回事?我意识到双倍足够好,但是我只是想知道问题是什么。 我意识到我不需要为定义创建const变量。我只是搞砸了。

回答 1 投票 0


C函数调用堆栈,不存在中间功能(RIP = 1)

在观察堆栈帧的同时,我看到,在B()调用C()之后,在下一个堆栈框架中,RIP指向'1',即rip = 1。c()的所有输入参数也都推到了此堆栈。 只保存了RIP,我看不到任何其他重新指定,包括将EBP推入堆栈。

回答 0 投票 0

有一种方法可以拦截和修改特定程序的所有syscall?

这可能是一个奇怪的问题,这可能是不可能的,但是有没有办法拦截特定程序的所有Syscall?我可以完全控制该文件,这意味着我可以扫描和...

回答 1 投票 0

在X86-64 System上的大页面支持上的页面偏移

支持x86-64的地址翻译,用于100秒的gpu泳道。

回答 1 投票 0

堆栈中的reserve字节:x86组件(64位)

PUSHQ%RBP MOVQ%RSP,%RBP subq $ 32,%rsp 我有一个关于第三条指令中“ $ 32”的解释的问题。来自搜索和博客的信息指定在以上第三次

回答 2 投票 0

64位等效于x86图像处理程序中的BSWAP 我在例行程序中使用的Delphi Firemonkey Exif实现来加载图像文件。 我正在尝试确定图像是否已旋转,因此我可以纠正

type TMarker = packed record Marker : Word; //Section marker Len : Word; //Length Section Indefin : Array [0..4] of Char; //Indefiner - "Exif" 00, "JFIF" 00 and ets Pad : Char; //0x00 end; TIFDHeader = packed record pad : Byte; //00h ByteOrder : Word; //II (4D4D) or MM i42 : Word; //2A00 (magic number from the 'Hitchhikers Guide' Offset : Cardinal; //0th offset IFD Count : Word; // number of IFD entries end; function SwapLong(Value: Cardinal): Cardinal; asm bswap eax end; procedure TExif.ReadFromFile(const FileName: string); var j: TMarker; ifd: TIFDHeader; off0: Cardinal; //Null Exif Offset SOI: Word; //2 bytes SOI marker. FF D8 (Start Of Image) f: File; begin if not FileExists(FileName) then exit; Init; System.FileMode:=0; //Read Only open AssignFile(f,FileName); reset(f,1); BlockRead(f,SOI,2); if SOI=$D8FF then begin //Is this Jpeg BlockRead(f,j,9); if j.Marker=$E0FF then begin //JFIF Marker Found Seek(f,20); //Skip JFIF Header BlockRead(f,j,9); end; //Search Exif start marker; if j.Marker<>$E1FF then begin i:=0; repeat BlockRead(f,SOI,2); //Read bytes. inc(i); until (EOF(f) or (i>1000) or (SOI=$E1FF)); //If we find maker if SOI=$E1FF then begin Seek(f,FilePos(f)-2); //return Back on 2 bytes BlockRead(f,j,9); //read Exif header end; end; if j.Marker=$E1FF then begin //If we found Exif Section. j.Indefin='Exif'. FValid:=True; off0:=FilePos(f)+1; //0'th offset Exif header BlockRead(f,ifd,11); //Read IDF Header FSwap := ifd.ByteOrder=$4D4D; // II or MM - if MM we have to swap if FSwap then begin ifd.Offset := SwapLong(ifd.Offset); ifd.Count := Swap(ifd.Count); end; if ifd.Offset <> 8 then begin Seek(f, FilePos(f)+abs(ifd.Offset)-8); end;

回答 2 投票 0

POINTER追求基准 - 意外缺乏订单执行?

,但结果似乎并不是我所期望的。 Multichase本质上只是您经典的指针追求基准,只是作者似乎已经竭尽全力确保硬件预摘要失败。它报告了脱离指针的平均延迟,并且可以选择交织“工作”,这基本上只是一个空的循环。相关代码段如下:

回答 1 投票 0


理解X86_64在64位系统上呼叫指令

一起拆卸的C程序,我在X86_64“呼叫”指令周围缠绕头很难

回答 1 投票 0

在MASM/MASM64

如果目标体系结构是I386或AMD64,我如何在编译时间从ASM源文件中检测到? 我正在使用MASM(ML.EXE)/MASM64(ML64.EXE)组装File32.asm和File64.asm。会是ni ...

回答 4 投票 0

为什么我的装配代码不起作用? (64位x86 ubuntu)?

该代码如何在第一个字符串之后打印新线路? 1部分.DATA 2 QueryUsernumber db'选择1到100之间的数字:' 3 QueryUsernumberLength Equ $ -

回答 1 投票 0

提供支持AVX2支持F16C的所有处理器?

可以肯定地假设所有支持AVX2的机器也支持F16C说明?目前,我还没有遇到任何没有这样做的机器。谢谢

回答 1 投票 0




C++长双(128位)精度

<= 0) return 1; for (long i ...

回答 1 投票 0


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.