簡體   English   中英

從 unsigned char 轉換為 long long 時理解匯編代碼

[英]Understanding assembly code when converting from unsigned char to long long

考慮代碼c.c

void f(unsigned char *a, long long *b)
{
    *b = (long long)*a;
}

編譯它

$ gcc -Og -S c.c

在哪里

$ gcc --version
gcc (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 10.2.0

我的機器是 64 位 Windows 10。

除其他外,我得到如下匯編代碼

01 movzbl  (%rcx), %eax
02 movq    %rax, (%rdx)

我的問題是:為什么第一行不是這樣寫的

01 movzbq  (%rcx), %rax

如果%rax的高 32 位最初有一些非零位,並且在movzbl (%rcx), %eax之后沒有設置為零怎么辦? 這些非零位(如果有)不會被movq %rax, (%rdx)復制到(%rdx) rdx) 嗎?

一個后續問題是:即使上面的關注也不需要,仍然,為什么第一行不是這樣寫的

01 movzbq  (%rcx), %rax

即從 C 到匯編代碼的轉換受哪個規則的約束以給定的方式完成?

(我對 C 有一些了解,但對匯編代碼不熟悉。)

更新:想在我閱讀評論后做出一些澄清(感謝所有評論)。 一條評論說 function 是不必要的,我可以做那個任務。 沒錯。 正如另一條評論正確地指出的那樣,這是一個精簡的例子。 我想了解的只是為什么在將unsigned char轉換為long long時會以這種方式發生 C 到程序集的轉換。

movzbl 1) 零擴展到 32 位 ('z'),以及 2) 零擴展到 64 位(32 位操作數隱含地“零擴展”)用於%eax

32 位指令movzbl的編碼比 64 位指令movzbq的編碼短。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM