① 一段c語言 反匯編代碼,要求詳解每句含義
and $0xfffffff0,%esp 將esp和16進制的fffffff0進行與運算,
cmp $0xfffff000,%eax 將fffff000減去eax,但只改變標志位,而不影響兩個數的大小,一般CMP指令後面會跟一個跳轉指令,也可以說CMP指令是比較指令
neg %ebx 求EBX相反數的補碼
nop指令的機器碼是90,也就是空指令,不起作用的,sub $0x8,%esp這條指令是用於平衡堆棧的,如樓上所說,你可以當它是空氣..有些匯編代碼不用刻意去看懂,掃一眼知道是干什麼用的就行了,有的就得仔細推敲它的含意和它起的作用
② c語言反匯編代碼解釋
a1是你定義的變數,char類型,佔1個位元組,所以byte ptr, [a1]就是取出a1的內容
連起來就是,以一個位元組的方式取出[a1]的內容
至於為什麼是a1, 這個是vc為了好觀察才這么做的,如果你拿ollydbg看的話,那麼只會是
mov byte ptr [ebp-XX], 61h
③ C語言是怎麼經過轉換將變數的值存儲在內存中的
C語言編譯器負責將源代碼中的十進制的10翻譯成4位元組數據:0A(16進制)(實際存儲為二進制,但描述起來太長不方便一般用16進制顯示和描述),而一個位元組的10實際上的二進制就是你說的00001010。
實際上在處理存儲之前需要先分配一個內存給變數 i,並在編譯環境中注冊登記這個變數名-地址關系(變數表),方便後續代碼訪問此變數時匹配到該地址,比如遇到 i=i+2時,編譯器就會生成一個指令對該地址的值進行+2操作。此外還需要生成一個MOV指令代碼指揮CPU執行:數據保存到該地址。
如果你對編譯後的細節感興趣,可以在調試時按CTRL+ALT+D(VS的快捷鍵,也可以通過菜單導航到「調試-窗口-反匯編」,其他編譯器在調試菜單中找)切換到反匯編窗口查看編譯結果,系統會逐條顯示每一條語句對應的匯編指令。
當你對匯編指令感到好奇之後,可以看看匯編、編譯原理、8086 CPU原理、以及數字電路的解碼器 等書籍,不需要完全看懂,了解下會對你學習任何編程語言有幫助,不僅僅局限於C語言。
④ C語言的學習過程
1、就C語言本身來說,可以分為三個階斷的學習:
其一,語法階斷,要對所有的語法知識點有所了解。沒必要記,但是得有個印象,在實際開發中,不懂就查,慢慢的也就熟悉啦。
其二、底層階斷,主要是從內存角度、反匯編角度、編譯角度來理解C的語法知識,因為C語言只是C編譯器的功能。這裡面涉及的基礎知識很多,比如從內存角度來理解,要涉及操作系統原理、計算機組成原理等等大學本科計算機專業最基礎的學科。
其三、設計階斷,學語言就是為了編程,要多實踐,多從別人的實踐中取得設計經驗,這個是最重要的,也是最難的。
以上是個人的觀點,概括來說,第1個階斷是見道,第2個階斷是修道,第3個階斷是行道,這個道便是C語言的編程之道。
2、大的方向來看 ,先把C語言弄精通,然後向上可以學習C++,也可以學習C系風格的語言,比如php、java等等,走應用程序開發路線,向下可以學習匯編、硬體編程,走底層系統程序開發。
⑤ C語言寫的程序 怎麼反匯編成匯編語言
在keilc中,單片機的C語言程序可以再DEBUG模式中得到對應的匯編程序。步驟如下:
1、建立工程,導入C文件代碼,編譯生成hex文件。
3、點擊View--Disassembly Window調出匯編窗口,如上圖。
通過以上步驟就可以看到與C對應的匯編程序了。
⑥ C語言計算的問題
3.0/2以及3.0/2.0結果都是雙精度浮點數,佔8個位元組。你提供的格式符,%d %f代表的類型都是4位元組。
反匯編代碼如下:
.file "1.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC1:
.ascii "%d %d\0"
LC2:
.ascii "\12 %d %f\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB13:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
call ___main
fldl LC0
fstpl 12(%esp)
fldl LC0
fstpl 4(%esp)
movl $LC1, (%esp)
call _printf
fldl LC0
fstpl 12(%esp)
fldl LC0
fstpl 4(%esp)
movl $LC2, (%esp)
call _printf
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE13:
.section .rdata,"dr"
.align 8
LC0:
.long 0
.long 1073217536
.ident "GCC: (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 4.9.2"
.def _printf; .scl 2; .type 32; .endef
那個LC0就是1.5在內存中的存儲形式,它的前4位元組剛好是0,所以你看到的只有0