我正在努力學習匯編,我在理解堆疊上的記憶體分配/檢索方面遇到了一些麻煩。
當字串被分配到堆疊上時,程式知道當它到達一個空終止字符/x00時停止讀取字串。然而,對于數字來說,沒有這樣的事情。程式如何知道分配在堆疊中的數字的結束,以及如何區分不同的數字型別(短、長、int)?
(我對這個問題有點陌生,所以請糾正我可能誤解的地方!)
型別(int vs. float vs. char * vs. struct foo)只有在翻譯程序中才真正重要,當編譯器分析你的源代碼并將其轉換為適當的機器代碼。 這時,諸如"[]的一個運算元應具有指標型別,另一個應具有整數型別"、"單數*的運算元應具有指標型別 "和 "乘法運算子的運算元應具有算術型別 "等規則被強制執行。
匯編語言通常處理位元組、字(2位元組)、長字(4位元組)等,盡管一些特殊用途的平臺可能有奇怪的字大小。 操作碼addb1加入兩個位元組大小的物體的內容,addl加入兩個長字大小的物體的內容,等等。 因此,當編譯器在翻譯你的代碼時,它會根據物件的宣告型別為其使用正確的操作碼。 因此,如果你宣告的東西是short,編譯器將(通常)使用用于字大小的物件的操作碼(addw,movw,等等)。 如果你宣告的東西是int或long,它將(通常)使用針對長字大小物件的操作碼(addl, movl)。 浮點型別通常用一組不同的操作碼和它們自己的暫存器組來處理。
簡而言之,匯編語言通過編譯器指定的操作碼 "知道 "事物的位置和大小。
簡單的例子--這里有一些C源代碼,它與一個int和一個short一起作業:
#include <stdio.h>
int main( void )
{
int x;
short y;
printf( "Gimme an x: " ) 。
scanf( "%d"/span>, &x )。
y = 2 * x 30;
printf( "x = %d, y = %hd
", x, y )。)
return 0;
我使用-Wa,-aldh選項和gcc來生成一個與源代碼交錯的匯編代碼串列,給了我
GAS LISTING /tmp/cc3D25hf.s page 1
1 .file "simple.c"/span>
2 .text
3 .Ltext0:
4 .section .rodata
5 .LC0:
6 0000 47696D6D .string Gimme an x。"
6 6520616E
6 20783A20
6 00
7 .LC1:
8 000d 256400 .string "%d" .
9 .LC2:
10 0010 78203D20 .string "x = %d, y = %hd
"
10 25642C20
10 79203D20
10 2568640A
10 00
11 .text
12 .globl main
14 main:
15 .LFB0:
16 .file 1 "simple.c"
1:simple.c **** #include <stdio.h>.
2: simple.c ****
3:simple.c **** int main( void )
4:simple.c **** {
17 .loc 1 4 0 .
18 .cfi_startproc
19 0000 55 pushq %rbp
20 .cfi_def_cfa_offset16
21 .cfi_offset 6, 16.
22 0001 4889E5 movq %rsp, %rbp
23 .cfi_def_cfa_register 6 .
24 0004 4883EC10 subq $16, %rsp
5: simple.c **** int x;
6:simple.c **** short y;
7:simple.c ****
8:simple.c **** printf( "Gimme an x: " );
25 .loc 1 8 0
26 0008 BF000000 movl $.LC0,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/320409.html
標籤:
上一篇:回圈到第二個方程
