c语言写汇编语言
‘壹’ 如何将c语言变成汇编
理论上来说C语言改成汇编是完全可以的,当然实际上还是有一定难度。
1、完全手工根据C语言的流程和目的,改编成汇编语言,这样做工作量很大
2、利用仿真软件,在仿真环境下,是有相应的汇编代码的,这样做工作量相对较小,但可读性较差。
‘贰’ C语言为什么要先编译成汇编语言
C语言,具有可移植性,或者说同样的代码可以在不同cpu平台上运行得到同样的结果
汇编语言,移植性差,一般针对某型cpu,每个类型的cpu都有自己的汇编语言
为保证C语言编制的通用算法的可移植性,比如我们用C编写了一套mp3解码算法程序,要在pc机上、手机上都能用,那么我们就采用通用的C编译器,将C语言程序编译成指定CPU的汇编语言,再汇编成机器可执行程序。
另一个用途是程序优化问题,在C语言层次,由于是高级语言,不涉及底层硬件,那么底层硬件的特性不能够得到充分利用,在需要优化算法的场合,我们需要将C语言算法编译生成汇编程序,然后修改需要优化的汇编程序达到目的。比如,你在手机上经常会遇到音频解码器,需要安装,而且不同的cpu需要选择不同的解码器,这些解码器应当就是在汇编层次上优化了算法的可执行代码,关键部分经过汇编级优化,不需要优化部分仍然使用C语言编译的结果。
‘叁’ C语言写的程序 怎么反汇编成汇编语言
在keilc中,单片机的C语言程序可以再DEBUG模式中得到对应的汇编程序。步骤如下:
1、建立工程,导入C文件代码,编译生成hex文件。
3、点击View--Disassembly Window调出汇编窗口,如上图。
通过以上步骤就可以看到与C对应的汇编程序了。
‘肆’ 怎么把c语言转换成汇编语言啊
1、打开VC6、0,在VC6、0中进行增加参数/FA的操作,编译后debug目录中将会增加对应源文件的汇编文件;
2、如果想查看C语句对应的汇编代码的话,可以按F11单步调试,在debug工具栏中选择“disassembly”即可。每行C代码下面就是对应的汇编代码。如果debug工具栏不见了,可在VC上方空白菜单处右键,选择“debug”即可弹出debug工具栏。
‘伍’ 如何将c语言程序转成汇编语言程序。
如果是VC则在编译器命令行参数再加 /FA 则会生成汇编代码。如果参数是 /FAs 则会同时将源码和汇编代码。
/FA 程序集代码;.asm
/FAc 机器码和程序集代码;.cod
/FAs 源代码和程序集代码;.asm
/FAcs 机器码、源代码和程序集码;.cod
/Fa的用法
/Fa 为编译中的每个源代码文件创建一个源文件.asm。
/Fa文件名 将文件名.asm 放到当前目录中。仅在编译单个源代码文件时有效。
/Fa文件名.扩展名 将文件名.扩展名放到当前目录中。仅在编译单个源代码文件时有效。
/Fa目录\ 为编译中的每个源代码文件创建一个源文件.asm,并将其放到指定目录中。请注意必须有后缀反斜杠。只允许使用当前磁盘上的路径。
/Fa目录\文件名 将文件名.asm 放到指定目录中。仅在编译单个源代码文件时有效。
/Fa目录\文件名.扩展名 将文件名.扩展名放到指定目录中。仅在编译单个源代码文件时有效。
如果你是用gcc 或 g++编译器,如dev c++则加入命令行参数 -S 即可
‘陆’ C语言是什么写的
1、最早的C语言是汇编语言写的。任何计算机语言编写完成后,都要转换成二进制形式的机器语言,才能运行。机器语言也就是二进制代码,可以和汇编语言一一对应。最早的时候是机器语言,也就是二进制的01代码,但是这个不容易读懂,所以人们发明了助记符,也就是汇编语言,让机器的01代码和汇编的助记符一一对应,这样容易记忆和读懂。汇编虽然能读懂,但是利用的时候还是非常繁琐,所以人们发明了高级语言,也就是b,c,p,f等语言,这样大大减少了编写程序的工作量。
2、c语言,是用c的标准格式编写的,用c的编译环境把程序转换为机器语言才能在计算机中运行,c很早的变异环境tc是用汇编写的,后来的vc编译环境就不是了。一般的程序,是用高级语言编写,最后用汇编代码优化一下。
‘柒’ C语言转汇编语言(把下面的C语言转成单片机汇编语言)
; .\test5.SRC generated from: test5.c
; COMPILER INVOKED BY:
; E:\Program Files\keil\C51\BIN\C51.EXE test5.c BROWSE DEBUG OBJECTEXTEND SRC(.\test5.SRC)
$NOMOD51
NAME TEST5
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
EXF2 BIT 0C8H.6
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
p21 BIT 0A0H.1
PT0 BIT 0B8H.1
p23 BIT 0A0H.3
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
p25 BIT 0A0H.5
TR1 BIT 088H.6
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2CON DATA 0C8H
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?timer0?TEST5 SEGMENT CODE
?PR?timer1?TEST5 SEGMENT CODE
?PR?_delay?TEST5 SEGMENT CODE
?PR?_pwm1?TEST5 SEGMENT CODE
?PR?_pwm0?TEST5 SEGMENT CODE
?PR?foot0?TEST5 SEGMENT CODE
?PR?foot1?TEST5 SEGMENT CODE
?PR?foot2?TEST5 SEGMENT CODE
?PR?foot3?TEST5 SEGMENT CODE
?PR?main?TEST5 SEGMENT CODE
?CO?TEST5 SEGMENT CODE
?DT?TEST5 SEGMENT DATA
EXTRN CODE (?C_STARTUP)
PUBLIC rud1
PUBLIC z
PUBLIC y
PUBLIC x
PUBLIC n
PUBLIC m
PUBLIC l
PUBLIC k
PUBLIC j
PUBLIC i
PUBLIC d
PUBLIC c?
PUBLIC b
PUBLIC a?
PUBLIC rud3
PUBLIC rud2
PUBLIC date1
PUBLIC date0
PUBLIC main
PUBLIC foot3
PUBLIC foot2
PUBLIC foot1
PUBLIC foot0
PUBLIC _pwm0
PUBLIC _pwm1
PUBLIC _delay
PUBLIC timer1
PUBLIC timer0
RSEG ?DT?TEST5
rud2: DS 2
rud3: DS 2
a?: DS 2
b: DS 2
c?: DS 2
d: DS 2
i: DS 2
j: DS 2
k: DS 2
l: DS 2
m: DS 2
n: DS 2
x: DS 2
y: DS 2
z: DS 2
rud1: DS 2
RSEG ?CO?TEST5
date0:
DW 004B0H
DW 004C9H
DW 004E2H
DW 004FBH
DW 00514H
DW 0052DH
DW 00546H
DW 0055FH
DW 00578H
DW 00591H
DW 005AAH
DW 005C3H
DW 005DCH
DW 005F5H
DW 0060EH
DW 00627H
DW 00640H
DW 00659H
DW 00672H
DW 0068BH
DW 006A4H
DW 006BDH
DW 006D6H
DW 006EFH
DW 00708H
date1:
DW 003E8H
DW 00401H
DW 0041AH
DW 00433H
DW 0044CH
DW 00465H
DW 0047EH
DW 00497H
DW 004B0H
DW 004C9H
DW 004E2H
DW 004FBH
DW 00514H
DW 0052DH
DW 00546H
DW 0055FH
DW 00578H
DW 00591H
DW 005AAH
DW 005C3H
DW 005DCH
DW 005F5H
DW 0060EH
DW 00627H
DW 00640H
DW 00659H
DW 00672H
DW 0068BH
DW 006A4H
DW 006BDH
DW 006D6H
DW 006EFH
DW 00708H
DW 00721H
DW 0073AH
DW 00753H
DW 0076CH
DW 00785H
DW 0079EH
DW 007B7H
DW 007D0H
; # include <reg52.h>
; #define uchar unsigned char
; #define uint unsigned int
; uint a,b,c,d,i,j,k,x,y,z,l,m,n,rud1,rud2,rud3;
; sbit p21=P2^1;
; sbit p23=P2^3;//
; sbit p25=P2^5; //
; int code date0[]={1200,1225,1250,1275,1300,
; 1325,1350,1375,1400,
; 1425,1450,1475,1500,
; 1525,1550,1575,1600,
; 1625,1650,1675,1700,
; 1725,1750,1775,1800}; //p25 25个
;
; int code date1[]={1000,1025,1050,1075,1100,
; 1125,1150,1175,1200,
; 1225,1250,1275,1300,
; 1325,1350,1375,1400,
; 1425,1450,1475,1500,
; 1525,1550,1575,1600,
; 1625,1650,1675,1700,
; 1725,1750,1775,1800,
; 1825,1850,1875,1900,
; 1925,1950,1975,2000}; //p21&p23 41个
;
CSEG AT 0000BH
LJMP timer0
; void timer0(void) interrupt 1
RSEG ?PR?timer0?TEST5
USING 0
timer0:
PUSH ACC
PUSH PSW
; SOURCE LINE # 26
; {
; p25=~p25;
; SOURCE LINE # 28
CPL p25
; c=20000-c;
; SOURCE LINE # 29
CLR C
MOV A,#020H
SUBB A,c?+01H
MOV c?+01H,A
MOV A,#04EH
SUBB A,c?
MOV c?,A
; TH0=-(c/256); TL0=-(c%256);
; SOURCE LINE # 30
CPL A
INC A
MOV TH0,A
MOV A,c?+01H
CPL A
INC A
MOV TL0,A
; }
; SOURCE LINE # 31
POP PSW
POP ACC
RETI
; END OF timer0
CSEG AT 0001BH
LJMP timer1
; void timer1(void) interrupt 3
RSEG ?PR?timer1?TEST5
USING 0
timer1:
PUSH ACC
PUSH PSW
; SOURCE LINE # 32
; {
;
; p21=~p21;
; SOURCE LINE # 35
CPL p21
; p23=~p23;
; SOURCE LINE # 36
CPL p23
; d=20000-d;
; SOURCE LINE # 37
CLR C
MOV A,#020H
SUBB A,d+01H
MOV d+01H,A
MOV A,#04EH
SUBB A,d
MOV d,A
; TH1=-(d/256); TL1=-(d%256);
; SOURCE LINE # 38
CPL A
INC A
MOV TH1,A
MOV A,d+01H
CPL A
INC A
MOV TL1,A
;
; }
; SOURCE LINE # 40
POP PSW
POP ACC
RETI
; END OF timer1
;
; void delay(t)
RSEG ?PR?_delay?TEST5
L?0033:
USING 0
MOV R7,#030H
MOV R6,#075H
LCALL _delay
LCALL _delay
LCALL _delay
LCALL _delay
_delay:
; SOURCE LINE # 42
;---- Variable 't?240' assigned to Register 'R6/R7' ----
; {for(l=1;l<=t;l++);}
; SOURCE LINE # 43
MOV l,#00H
MOV l+01H,#01H
?C0003:
SETB C
MOV A,l+01H
SUBB A,R7
MOV A,l
SUBB A,R6
JNC ?C0006
INC l+01H
MOV A,l+01H
JNZ ?C0003
INC l
?C0028:
SJMP ?C0003
?C0006:
RET
; END OF _delay
;
; void pwm1(y)
RSEG ?PR?_pwm1?TEST5
L?0035:
USING 0
MOV A,j+01H
ADD A,ACC
MOV R7,A
MOV A,j
RLC A
MOV R6,A
MOV A,#LOW (date1)
ADD A,R7
MOV DPL,A
MOV A,#HIGH (date1)
ADDC A,R6
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV A,#01H
MOVC A,@A+DPTR
MOV R7,A
_pwm1:
; SOURCE LINE # 45
;---- Variable 'y?341' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 46
; b=y;
; SOURCE LINE # 47
MOV b,R6
MOV b+01H,R7
; d=b;
; SOURCE LINE # 48
MOV d,b
MOV d+01H,b+01H
; p21=1;
; SOURCE LINE # 49
SETB p21
; p23=1;
; SOURCE LINE # 50
SETB p23
; TH1=-(b/256); TL1=-(b%256);
; SOURCE LINE # 51
MOV A,b
CPL A
INC A
MOV TH1,A
MOV A,b+01H
CPL A
INC A
MOV TL1,A
; TR1=1;//启动定时器
; SOURCE LINE # 52
SETB TR1
; }
; SOURCE LINE # 53
RET
; END OF _pwm1
; void pwm0(x)
RSEG ?PR?_pwm0?TEST5
L?0034:
USING 0
MOV A,i+01H
ADD A,ACC
MOV R7,A
MOV A,i
RLC A
MOV R6,A
MOV A,#LOW (date0)
ADD A,R7
MOV DPL,A
MOV A,#HIGH (date0)
ADDC A,R6
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV A,#01H
MOVC A,@A+DPTR
MOV R7,A
_pwm0:
; SOURCE LINE # 54
;---- Variable 'x?442' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 55
; a=x;
; SOURCE LINE # 56
MOV a?,R6
MOV a?+01H,R7
; c=a;
; SOURCE LINE # 57
MOV c?,a?
MOV c?+01H,a?+01H
; p25=1;
; SOURCE LINE # 58
SETB p25
; TH0=-(a/256); TL0=-(a%256);
; SOURCE LINE # 59
MOV A,a?
CPL A
INC A
MOV TH0,A
MOV A,a?+01H
CPL A
INC A
MOV TL0,A
; TR0=1;//启动定时器
; SOURCE LINE # 60
SETB TR0
; }
; SOURCE LINE # 61
RET
; END OF _pwm0
; void foot0()
RSEG ?PR?foot0?TEST5
foot0:
USING 0
; SOURCE LINE # 62
; {
; SOURCE LINE # 63
; for(i=0;i<24;i++)
; SOURCE LINE # 64
CLR A
MOV i,A
MOV i+01H,A
?C0009:
; {
; SOURCE LINE # 65
; pwm0(date0[i]);
; SOURCE LINE # 66
LCALL L?0034
; delay(888);
; SOURCE LINE # 67
MOV R7,#078H
MOV R6,#03H
LCALL _delay
; }
; SOURCE LINE # 68
INC i+01H
MOV A,i+01H
JNZ ?C0029
INC i
?C0029:
CLR C
SUBB A,#018H
MOV A,i
SUBB A,#00H
JC ?C0009
; }
; SOURCE LINE # 69
?C0012:
RET
; END OF foot0
; void foot1()
RSEG ?PR?foot1?TEST5
foot1:
USING 0
; SOURCE LINE # 70
; {
; SOURCE LINE # 71
; for(j=0;j<14;j++)
; SOURCE LINE # 72
CLR A
MOV j,A
MOV j+01H,A
?C0013:
; { pwm1(date1[j]);
; SOURCE LINE # 73
LCALL L?0035
; delay(1332);
; SOURCE LINE # 74
MOV R7,#034H
MOV R6,#05H
LCALL _delay
; }
; SOURCE LINE # 75
INC j+01H
MOV A,j+01H
JNZ ?C0030
INC j
?C0030:
CLR C
SUBB A,#0EH
MOV A,j
SUBB A,#00H
JC ?C0013
; }
; SOURCE LINE # 76
?C0016:
RET
; END OF foot1
; void foot2()
RSEG ?PR?foot2?TEST5
foot2:
USING 0
; SOURCE LINE # 77
; {
; SOURCE LINE # 78
; for(i=24;i>1;i--)
; SOURCE LINE # 79
MOV i,#00H
MOV i+01H,#018H
?C0017:
; {
; SOURCE LINE # 80
; pwm0(date0[i]);
; SOURCE LINE # 81
LCALL L?0034
; delay(888);
; SOURCE LINE # 82
MOV R7,#078H
MOV R6,#03H
LCALL _delay
; }
; SOURCE LINE # 83
MOV A,i+01H
DEC i+01H
JNZ ?C0031
DEC i
?C0031:
SETB C
MOV A,i+01H
SUBB A,#01H
MOV A,i
SUBB A,#00H
JNC ?C0017
; }
; SOURCE LINE # 84
?C0020:
RET
; END OF foot2
; void foot3()
RSEG ?PR?foot3?TEST5
foot3:
USING 0
; SOURCE LINE # 85
; {
; SOURCE LINE # 86
; for(j=14;j>1;j--)
; SOURCE LINE # 87
MOV j,#00H
MOV j+01H,#0EH
?C0021:
; {
; SOURCE LINE # 88
; pwm1(date1[j]);
; SOURCE LINE # 89
LCALL L?0035
; delay(1332);
; SOURCE LINE # 90
MOV R7,#034H
MOV R6,#05H
LCALL _delay
; }
; SOURCE LINE # 91
MOV A,j+01H
DEC j+01H
JNZ ?C0032
DEC j
?C0032:
SETB C
MOV A,j+01H
SUBB A,#01H
MOV A,j
SUBB A,#00H
JNC ?C0021
; }
; SOURCE LINE # 92
?C0024:
RET
; END OF foot3
; void main(void)
RSEG ?PR?main?TEST5
main:
USING 0
; SOURCE LINE # 93
; {
; SOURCE LINE # 94
; p21=0;p23=0;p25=0;
; SOURCE LINE # 95
CLR p21
CLR p23
CLR p25
; TMOD=0x11;EA=1;ET0=1;ET1=1;
; SOURCE LINE # 96
MOV TMOD,#011H
SETB EA
SETB ET0
SETB ET1
; delay(30000); delay(30000); delay(30000); delay(30000);delay(30000);
; SOURCE LINE # 97
LCALL L?0033
; pwm0(1200);
; SOURCE LINE # 98
MOV R7,#0B0H
MOV R6,#04H
LCALL _pwm0
; pwm1(1000);
; SOURCE LINE # 99
MOV R7,#0E8H
DEC R6
LCALL _pwm1
; delay(30000); delay(30000); delay(30000); delay(30000);delay(30000);
; SOURCE LINE # 100
LCALL L?0033
?C0025:
; while(1)
; SOURCE LINE # 101
; {
; SOURCE LINE # 102
; p21=0;p23=0;p25=0;
; SOURCE LINE # 103
CLR p21
CLR p23
CLR p25
; foot0();//delay(30000);
; SOURCE LINE # 104
LCALL foot0
; foot1();//delay(30000);
; SOURCE LINE # 105
LCALL foot1
; foot2();//delay(30000);
; SOURCE LINE # 106
LCALL foot2
; foot3();//delay(30000);
; SOURCE LINE # 107
LCALL foot3
; }
; SOURCE LINE # 108
SJMP ?C0025
; END OF main
END
;--------------------------------------------------------
;我是用keil uvision2转的。
;你C语言编译时正常,但转成汇编后就编译有问题。
;错误信息如下:
;test5.src(138): error A8: ATTEMPT TO DEFINE AN ALREADY DEFINED LABEL
;我也不知道哪来的错误。
;希望可以帮到你。
‘捌’ 实践,C语言是怎么变成汇编的
c语言未必会经历汇编语言这一环节,准确的说,c语言经历编译器(必须),链接器(某种程度上非必须)的处理,成为可执行代码(一般是二进制代码)。
而汇编也许是目前多数编译器提供的中间环节(vc,vs都提供在调试运行下使用反汇编的功能),因为对于汇编语言来说,进一步编译成机器语言的难度很低,只需查找有限的汇编指令对应的编码,如MOV,ADD等,具体编码与机器有关。
而你说的c语言变成汇编这一过程,正是编译器的核心工作,也是最为困难的。需要对你的程序(本质上是一个超长的字符串)做分割,词法分析,语法分析,最后翻译成汇编。