① 一段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