[英]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.