汇编语言解释
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。【摘要】
汇编语言解释【提问】
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。【回答】
希望可以帮到您哦。[抱抱]【回答】
汇编指令cli是什么意思?
CLI汇编指令全称为Clear Interupt,该指令的作用是禁止中断发生,在CLI起效之后,所有外部中断都被屏蔽,这样可以保证当前运行的代码不被打断,起到保护代码运行的作用。STI汇编指令全称为Set Interupt,该指令的作用是允许中断发生,在STI起效之后,所有外部中断都被恢复,这样可以打破被保护代码的运行,允许硬件中断转而处理中断的作用。扩展资料CLI和STI汇编指令只能在内核模式下执行,不可以在用户模式下执行;而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的执行(如移动鼠标等等),系统就会变得不稳定。其次,在标志寄存器中中断标志清零的情况下,可以以“int ××”的形式调用软中断。序员可以改变段地址和偏移地址,但是在这个过程中如果需要改变段寄存器SS和SP必须禁止中断,当改变完成后即可恢复中断(在cli指令后需要有与其配对的sti指令,否则计算机会崩溃)。参考资料来源:百度百科-汇编指令(其他指令)
汇编语言指令的基本格式是什么
汇编语言的指令格式,目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM;而Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法;
一、汇编语言语句的通用格式
[名称[:]] 指令码 [第一操作数][,第二操作数] ;注释
汇编语言的指令码的操作数的个数可以是0、1、2个;当操作数的个数为2的时候,语句还有两种不同的格式:
Windows下Intel风格的汇编语言语句格式为:
[名称[:]] 指令码 目的操作数DST,源操作数SRC ;注释
Unix/Linux下AT&T风格的汇编语言语句格式为:
[名称[:]] 指令码 源操作数SRC,目的操作数DST ;注释
例如: CYCLE: ADD AX,02H ;(AX)<-(AX)+02H
解释:
汇编语言语句格式中的"名称"并不是所有语句都必需的,但是,如果语句中带有"名称",那么,大多数情况下,"名称"都表示的是内存中某一存储单元的地址,也就是"名称"后面各项在内存中存放的第一个存储单元的地址(包括该"名称"所在段的段地址和段内偏移地址);比如上面的指令中,CYCLE就是该语句的名称,CYCLE表示的就是其后面的机器指令码在内存中存放的第一个地址;"名称"与指令码之间的分隔符可以是冒号":",也可以是空格字符" ";当以冒号分割时,该名称代表的是一个标号;当以空格分割时,该名称代表的可能是标号,也可能是变量;当指令码有多个操作数的时候,相邻两个操作数之间要用逗号","分割;指令码与操作数之间必须以空格分割;汇编语言语句的注释必须以分号";"开头;
主要的汇编指令有哪些?
LDR 和STR——用于字和无符号字节\x0d\x0a指令格式:\x0d\x0aLDR/STR{cond}{T} Rd,\x0d\x0aLDR/STR{cond}B{T} Rd, \x0d\x0a\x0d\x0aLDR{cond}{T} Rd, 加载指定地址的字数据到Rd中;\x0d\x0aSTR{cond}{T} Rd, 存储Rd中的字数据到指定的地址单元中;\x0d\x0aLDR{cond}B{T} Rd, 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);\x0d\x0aSTR{cond}B{T} Rd, 指令存储Rd中的最低字节数据到指定的地址单元中。\x0d\x0a T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。\x0d\x0a\x0d\x0a地址部分可用的形式有4种: \x0d\x0a\x0d\x0a零偏移(zero offset) [Rn] ,Rn的值作为传送数据的地址。如: \x0d\x0aLDR R0,[R1]; \x0d\x0a前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如: \x0d\x0aLDRB R0,[R1,#8]\x0d\x0aLDR R0,[R1,#8]! \x0d\x0a程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。 \x0d\x0a程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如: \x0d\x0aLDR R0,place ;\x0d\x0aplace地址装入R0 \x0d\x0a后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如: \x0d\x0aLDR R0,[R1],R2,LSL#2 ;\x0d\x0a将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。\x0d\x0a偏移量Flexoffset可以是下两种形式之:\x0d\x0a1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:\x0d\x0aSTR R5,[R7],#--8 \x0d\x0a2) 一个寄存器再加上移位(移位由立即数指定),如:\x0d\x0a{-}Rm{,shift} \x0d\x0a其中: \x0d\x0a- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。\x0d\x0aRm :内含偏移量的寄存器。Rm 不允许是R15。 \x0d\x0aShift:Rm 的可选移位方法。可以是下列形式的任何一种: \x0d\x0aASR n :算术右移n 位(1<=n<=32) \x0d\x0aLSL n :逻辑左移n 位(1<=n<=31) \x0d\x0aLSR n :逻辑右移n 位(1<=n<=32) \x0d\x0aROR n :循环右移n 位(1<=n<=31) \x0d\x0aRRX :循环右移1 位,带扩展。\x0d\x0aAND—————逻辑”与”操作指令\x0d\x0a指令格式:\x0d\x0a\x0d\x0aAND{cond}{S} Rd,Rn,operand2 \x0d\x0aAND指令将操作数operand2 与Rn 的值按位逻辑”与”,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。\x0d\x0a指令示例:\x0d\x0aANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位\x0d\x0aAND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。\x0d\x0a\x0d\x0aORR—————逻辑”或”操作指令\x0d\x0a指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑”或”,结果存放到目的寄存器Rd 中。指令示例: \x0d\x0aORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位\x0d\x0aORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。 \x0d\x0a\x0d\x0aBIC—————位清除指令\x0d\x0a指令格式:\x0d\x0aBIC{cond}{S} Rd,Rn,operand2 \x0d\x0aBIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。\x0d\x0a\x0d\x0aCMP—————比较指令 \x0d\x0a指令格式:\x0d\x0aCMP{cond} Rn,operand2 \x0d\x0aCMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。 \x0d\x0a指令示例: \x0d\x0acmp R0,R1 ;比较R0,R1 \x0d\x0abeq stop ;R0=R1跳到stop\x0d\x0ablt less ;R0<R1跳到Less \x0d\x0a\x0d\x0a. \x0d\x0a. \x0d\x0a. \x0d\x0a\x0d\x0aLess:\x0d\x0a. \x0d\x0a. \x0d\x0a. \x0d\x0aStop: \x0d\x0a.\x0d\x0a.\x0d\x0a.\x0d\x0aSUB—————减法运算指令\x0d\x0a指令格式:\x0d\x0aSUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器Rd 中。 指令示例: \x0d\x0aSUBS R1,R1,R2 ;R1=R1-R2,并并根据运算的结果更新标志位\x0d\x0aSUBGT R3,3,#1 ;大于则 R3=R3-1 \x0d\x0aSUB R0,R2,R3,LSL#2; R0=R2-(R3<<2)\x0d\x0a\x0d\x0aARM分支指令\x0d\x0a助记符\x0d\x0a\x0d\x0a 说明\x0d\x0a\x0d\x0a 操作\x0d\x0a\x0d\x0aB{cond} lable \x0d\x0a 分支指令\x0d\x0a\x0d\x0a PC← lable \x0d\x0a \x0d\x0aBL{cond} lable \x0d\x0a 带链接的分支指令\x0d\x0a\x0d\x0a LR← PC-4 ,PC←lable \x0d\x0a \x0d\x0aBX{cond} Rm \x0d\x0a 带状态切换的分支指令\x0d\x0a\x0d\x0a PC← Rm,切换处理器状态\x0d\x0a\x0d\x0a指令的条件码\x0d\x0a条件码 助记符后缀 标志 含义 \x0d\x0a0000 EQ Z置位(Z=1) 相等 \x0d\x0a0001 NE Z清零(Z=0) 不相等 \x0d\x0a0010 CS C置位 无符号数大于等于 \x0d\x0a0011 CC C清零 无符号数小于 \x0d\x0a0100 MI N置位 负数 \x0d\x0a0101 PL N清零 整数或0 \x0d\x0a0110 VS V置位 溢出 \x0d\x0a0111 VC V清零 未溢出 \x0d\x0a1000 HI C置位且Z清零 无符号数大于 \x0d\x0a1001 LS Z置位且C清零 无符号数小于等于 \x0d\x0a1010 GE N等于V(N=V=1或N=V=0) 带符号数大于或等于 \x0d\x0a1011 LT N不等于V 带符号数小于 \x0d\x0a1100 GT Z清零且N等于V 带符号数大于 \x0d\x0a1101 LE Z置位或N不等于V 带符号数小于或等于 \x0d\x0a1110 AL 忽略 无条件执行 \x0d\x0a\x0d\x0a;GPIO寄存器宏定义\x0d\x0aGPFCON EQU 0x56000050 \x0d\x0aGPFDAT EQU 0x56000054\x0d\x0aGPFUP EQU 0x56000058 \x0d\x0a\x0d\x0aEXPORT LEDTEST\x0d\x0aAREA LEDTESTASM,CODE,READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM,属性只读\x0d\x0a\x0d\x0aLEDTEST\x0d\x0a;设置GPF4-GPF7为output\x0d\x0aldr r0,=GPFCON \x0d\x0aldr r1,[r0]\x0d\x0abic r1,r1,#0xff00\x0d\x0aorr r1,r1,#0x5500\x0d\x0astr r1,[r0]\x0d\x0a\x0d\x0a;禁止GPF4-GPF7端口的上拉电阻\x0d\x0aldr r0,=GPFUP\x0d\x0aldr r1,[r0]\x0d\x0aorr r1,r1,#0xf0\x0d\x0astr r1,[r0]\x0d\x0a\x0d\x0alooptest\x0d\x0a;将数据端口F的数据寄存器的地址附给寄存器r2\x0d\x0aldr r2,=GPFDAT\x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xb0\x0d\x0astr r3,[r2] ;GPF6 output 0\x0d\x0aldr r0,=0x2fffff\x0d\x0abl delay ;调用延迟子程序\x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0x70\x0d\x0astr r3,[r2] ;GPF7 output 0\x0d\x0aldr r0,=0x2fffff ;初始计数值\x0d\x0abl delay ;调用延迟子程序 \x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xd0\x0d\x0astr r3,[r2] ;GPF5 output 0\x0d\x0aldr r0,=0x2fffff\x0d\x0abl delay ;调用延迟子程序\x0d\x0a\x0d\x0aldr r3,[r2]\x0d\x0abic r3,r3,#0xf0\x0d\x0aorr r3,r3,#0xe0\x0d\x0astr r3,[r2] ;GPF4 output 0\x0d\x0aldr r0,=0x2fffff\x0d\x0abl delay ;调用延迟子程序\x0d\x0a\x0d\x0ab looptest\x0d\x0adelay\x0d\x0asub r0,r0,#1 ;r0=r0-1 \x0d\x0acmp r0,#0x0 ;将r0的值与0相比较\x0d\x0abne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句\x0d\x0amov pc,lr ;返回\x0d\x0a\x0d\x0aEND ;程序结束符
主要的汇编指令有哪些啊
LDR 和STR——用于字和无符号字节
指令格式:
LDR/STR{cond}{T} Rd,
LDR/STR{cond}B{T} Rd,
LDR{cond}{T} Rd, 加载指定地址的字数据到Rd中;
STR{cond}{T} Rd, 存储Rd中的字数据到指定的地址单元中;
LDR{cond}B{T} Rd, 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);
STR{cond}B{T} Rd, 指令存储Rd中的最低字节数据到指定的地址单元中。
T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。
地址部分可用的形式有4种:
零偏移(zero offset) [Rn] ,Rn的值作为传送数据的地址。如:
LDR R0,[R1];
前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如:
LDRB R0,[R1,#8]
LDR R0,[R1,#8]!
程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。
程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如:
LDR R0,place ;
place地址装入R0
后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如:
LDR R0,[R1],R2,LSL#2 ;
将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
偏移量Flexoffset可以是下两种形式之:
1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:
STR R5,[R7],#--8
2) 一个寄存器再加上移位(移位由立即数指定),如:
{-}Rm{,shift}
其中:
- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。
Rm :内含偏移量的寄存器。Rm 不允许是R15。
Shift:Rm 的可选移位方法。可以是下列形式的任何一种:
ASR n :算术右移n 位(1<=n<=32)
LSL n :逻辑左移n 位(1<=n<=31)
LSR n :逻辑右移n 位(1<=n<=32)
ROR n :循环右移n 位(1<=n<=31)
RRX :循环右移1 位,带扩展。
AND―――――逻辑”与”操作指令
指令格式:
AND{cond}{S} Rd,Rn,operand2
AND指令将操作数operand2 与Rn 的值按位逻辑”与”,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。
指令示例:
ANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位
AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。
ORR―――――逻辑”或”操作指令
指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑”或”,结果存放到目的寄存器Rd 中。指令示例:
ORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位
ORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。
BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
CMP―――――比较指令
指令格式:
CMP{cond} Rn,operand2
CMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。
指令示例:
cmp R0,R1 ;比较R0,R1
beq stop ;R0=R1跳到stop
blt less ;R0<R1跳到Less
.
.
.
Less:
.
.
.
Stop:
.
.
.
SUB―――――减法运算指令
指令格式:
SUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器Rd 中。 指令示例:
SUBS R1,R1,R2 ;R1=R1-R2,并并根据运算的结果更新标志位
SUBGT R3,3,#1 ;大于则 R3=R3-1
SUB R0,R2,R3,LSL#2; R0=R2-(R3<<2)
ARM分支指令
助记符
说明
操作
B{cond} lable
分支指令
PC← lable
BL{cond} lable
带链接的分支指令
LR← PC-4 ,PC←lable
BX{cond} Rm
带状态切换的分支指令
PC← Rm,切换处理器状态
指令的条件码
条件码 助记符后缀 标志 含义
0000 EQ Z置位(Z=1) 相等
0001 NE Z清零(Z=0) 不相等
0010 CS C置位 无符号数大于等于
0011 CC C清零 无符号数小于
0100 MI N置位 负数
0101 PL N清零 整数或0
0110 VS V置位 溢出
0111 VC V清零 未溢出
1000 HI C置位且Z清零 无符号数大于
1001 LS Z置位且C清零 无符号数小于等于
1010 GE N等于V(N=V=1或N=V=0) 带符号数大于或等于
1011 LT N不等于V 带符号数小于
1100 GT Z清零且N等于V 带符号数大于
1101 LE Z置位或N不等于V 带符号数小于或等于
1110 AL 忽略 无条件执行
;GPIO寄存器宏定义
GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058
EXPORT LEDTEST
AREA LEDTESTASM,CODE,READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM,属性只读
LEDTEST
;设置GPF4-GPF7为output
ldr r0,=GPFCON
ldr r1,[r0]
bic r1,r1,#0xff00
orr r1,r1,#0x5500
str r1,[r0]
;禁止GPF4-GPF7端口的上拉电阻
ldr r0,=GPFUP
ldr r1,[r0]
orr r1,r1,#0xf0
str r1,[r0]
looptest
;将数据端口F的数据寄存器的地址附给寄存器r2
ldr r2,=GPFDAT
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xb0
str r3,[r2] ;GPF6 output 0
ldr r0,=0x2fffff
bl delay ;调用延迟子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0x70
str r3,[r2] ;GPF7 output 0
ldr r0,=0x2fffff ;初始计数值
bl delay ;调用延迟子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xd0
str r3,[r2] ;GPF5 output 0
ldr r0,=0x2fffff
bl delay ;调用延迟子程序
ldr r3,[r2]
bic r3,r3,#0xf0
orr r3,r3,#0xe0
str r3,[r2] ;GPF4 output 0
ldr r0,=0x2fffff
bl delay ;调用延迟子程序
b looptest
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
END ;程序结束符
汇编语言有哪些
常见的汇编语言有Intel汇编语言、Motorola汇编语言、IBM汇编语言、Zilog汇编语言以及ARM汇编语言等。拓展:汇编语言的应用涉及到很多领域,比如软件开发、硬件开发、操作系统内核开发、嵌入式系统开发以及网络编程等。网名:汇编控(Assembler Controller)。拓展:汇编语言作为计算机编程中的一种低级语言,具有计算机编程中最基本的概念,可以用来完成复杂的计算机操作,是编写系统软件的基础。
汇编语言是什么语言?
什么是汇编和汇编语言?
汇编语言是一种低级计算机编程语言,说"低级"并不是指语言的功能和复杂程度,而是它出现在计算机发展史的早期,但现在仍广泛应用于计算机开发领域,应为它是绝大多数语言的基础.再者,它是一种面向机器的语言,即它运行与操作都与计算机硬件密切相关.
C语言是一种高级语言,它有利于人为操作,近于面向对象与面向机器之间(VB就是一种面向对象的编程语言),它的功能更加强大,可移植性高,是当今最广泛的语言之一.
DOS汇编是说汇编语言的操作界面是DOST系统,这也说明是汇编是更低级一些,但执行鼎度是其它语言无法相比的,就是可移植性较差.
汇编语言是什么
计算机程序设计语言的发展,经历了从机器语言、汇编语言到高级语言的历程。
1. 机器语言
电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机的语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言,就是机器语言。使用机器语言是十分痛苦的,特别是在程序有错需要修改时,更是如此。而且,由于每台计算机的指令系统往往各不相同,所以,在一台计算机上执行的程序,要想在另一台计算机上执行,必须另编程序,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而运算效率是所有语言中最高的。机器语言,是第一代计算机语言。
2. 汇编语言
为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。
汇编语言同样十分依赖于机器硬件,移植性不好,但效率仍十分高,针对计算机特定硬件而编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,程序精炼而质量高,所以至今仍是一种常用而强有力的软件开发工具。
3. 高级语言
从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种这样的语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,1 9 5 4年,第一个完全脱离机器硬件的高级语言—F O RT R A N问世了,4 0多年来,共有几百种高级语言出现,有重要意义的有几十种,影响较大、使用较普遍的有F O RT R A N、A L G O L、C O B O L、B A S I C、L I S P、S N O B O L、P L / 1、P a s c a l、C、P R O L O G、A d a、C + +、V C、V B、D e l p h i、J AVA 等。
高级语言的发展也经历了从早期语言到结构化程序设计语言,从面向过程到非过程化程序语言的过程。相应地,软件的开发也由最初的个体手工作坊式的封闭式生产,发展为产业化、流水线式的工业化生产。
6 0年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是人自为战,缺乏科学规范的系统规划与测试、评估标准,其恶果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可靠,以致几乎没有不出错阀软件。这一切,极大地震动了计算机界,史称“软件危机”。人们认识到:大型程序的编制不同于写小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。程序的设计应易于保证正确性,也便于验证正确性。1 9 6 9年,提出了结构化程序设计方法,1 9 7 0年,第一个结构化程序设计语言—P a s c a l语言出现,标志著结构化程序设计时期的开始。
8 0年代初开始,在软件设计思想上,又产生了一次革命,其成果就是面向对象的程序设计。在此之前的高级语言,几乎都是面向过程的,程序的执行是流水线似的,在一个模块被执行完成前,人们不能干别的事,也无法动态地改变程序的执行方向。这和人们日常处理事物的......>>
汇编语言中@是什么意思
#表示立即数寻址。采用立即寻址方式的指令,在立即数前面加上立即寻址符“#”。
例如指令MOV A,#30H中30H就是立即数,指令功能为将30H赋给累加器A。
@表示寄存器的间接寻址。
例如指令MOV A,@R0就使用了寄存器间接寻址方式,这条指令的意义为将地址指针R0指向的内部数据存储器单元中的数据送入累加器A中。假设R0中内容为30H,则此指令的功能是以R0寄存器的内容30H为地址,把内部RAM 30H单元中的内容传送给累加器A。
什么是汇编语言
汇编语言它是计算机语言,计算机语言说通俗点就是人类与计算机(CPU)沟通的桥梁,计算机它不认识人类的语言,听不懂也读不懂,要让计算机替我们去完成我们的工作,就需要我们将要交给计算机完成的任务翻译为计算机语言。汇编语言是各种语言中的一种,它属于低级的计算机语言,这是相对于面向过程的C语言,以及面向对象的C++,java而言。它是除机器语言以外最接近硬件的计算机语言,而且可以通过学习汇编语言深入的了解操作系统的底层运行机制,并以CPU的角度思考问题。这样可以让你在编写高级语言的程序的时候避免很多错误,并且能更深入理解高级语言的执行 原理。因为汇编语言属于低级语言,所以既然低级就肯定不容易被普通用户认识,这需要一定的硬件基础知识和一些计算机工作原理的知识。以前在大学阶段学过汇编语言,但没有当回事儿,连作业都是复制加粘贴完成的(像这样的不在少数吧:))。工作以后才发现这个语言是个好东西,它其实是个非常重要的基础课程。所以现在有时间就把书打开多看一点,学一点。汇编语言目前常见的有两种:一个是基于8086/88架构的DOS下的16位汇编语言,还有就是基于80386架构及其以后型号的windows下32位汇编语言。我不知道linux下有没有汇编语言。顺便说一下,不管什么汇编语言它所编出来的程序都属于软件,所以不管什么软件都需要依赖操作系统这个基础平台,它才可以被硬件CPU所执行,因为操作系统就是提供硬件与用户之间的接口,所有软件都要通过它来分配到硬件资源(不知道对不对哈:)才可以被执行)。一般先学习16位的DOS汇编,然后再学32位的windows汇编。所以我们先谈谈16位的DOS汇编哈。要学汇编语言首先就是要了解CPU,你只有了解了CPU才能了解汇编语言的执行,因为它基本就是直接在操作CPU的各个组成单元(像寄存器)。在 *** 上找了这个图,如下:上面这个CPU的逻辑结构图是8088的,8088和8086大的架构差不多,所以就以这个为例介绍下各个组成部分的作用。主寄存器:AX(AH,AL)累加寄存器,一般用作暂存数据;BX(BH,BL)基址寄存器,一般用作偏移地址存放;CX(CH,CL)计数寄存器,一般用在循环控制次数;DX(DH,DL)数据寄存器,好像和AX差不多吧;SP堆栈指针寄存器,栈指针;BP基址指针寄存器,可作SP使用;SI源变址寄存器和DI目的变址寄存器,这两个做为BX扩展用于偏移地址存放。段寄存器: CS:代码段寄存器,任何一个程序都是从代码段开始执行的,CS寄存器指明了代码段的段地址。DS:数据段寄存器,存放程序中数据部分的段地址。SS:堆栈段寄存器,堆栈是内存中特殊的内存块,堆与栈不同,目前我只知道栈是尊循“先进后出,后进先出”的原则而使用。ES:附加段寄存器,应该是作为DS数据段寄存器的扩充吧。地址加法器: 这是用在对内存寻址时所使用,它通过将段寄存器中的段地址与BX、SI、DI等寄存器中的偏移地址作一定处理从而输出物理地址,然后就可以访问内存单元了。汇编程序中的地址只是逻辑地址,并不是真实的内存上的地址。在程序实际运行时每次访问内存都会先将逻辑地址转换成物理地址才可以访问到物理内存。关于CPU寻址,逻辑地址,物理地址我也会再写篇文章来讨论。逻辑运算单元和控制单元:这是CPU最核心的单元,我们暂只记住它们是负责执行与控制就好了。内部数据,地址总线:CPU内部各部件之间通信的通道。外部地址总线:用来传输CPU想要读取/写入内存单元的物理地址。它的宽度就决定了CPU能够访问的内存的最大容量。外部数据和控制总......>>
汇编语言里*是什么意思
其表示去0x804a260地址处的内存内容
参考blog.csdn/...314473
汇编语言的伪指令是什么?
简单理解就是汇编语言中那些没有对应机器指令的汇编指令。
在计算机中直接运行的程序所对应的叫机器(指令)语言,如果直接按二进制表示出来就是一系列 0 和 1 。当然,用机器语言编写程序的时代一般都使用八进制或十六进制,它们和二进制是3位对1位或4位对1位的关系,从而简化机器语言程序代码在书面(或屏幕)上的表示。即便如此,这种程序还是太令人望而生畏了,所以才有了“汇编”语言,其含义是用人类比较容易理解的符号来替代机器指令。假定一条加法指令的逻辑序列可用二进制表示为0110……1011,用八进制可表示为 3……3,用十六进制则表示为 6……B。而汇编语言则用 ADD x,y 这种形式来表示一条机器指令,即每一条机器指令都用一个对应的“汇编指令”来替代所形成的指令系统叫“汇编语言”,而将用汇编语言编写的程序翻译成机器语言的过程叫“汇编”过程。为了增加汇编语言的可读性和协助翻译程序对汇编源程序进行翻译而增加的汇编指令就是“伪指令”。
汇编语言有什么特点
汇编语言的总体特点1.机器相关性
这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
2.高速度和高效率
汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。
3.编写和调试的复杂性
由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。
优点
1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。
2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。
缺点
1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性;
2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试;
3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。
汇编语言和高级语言的区别是什么?
汇编语言是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。
高级语音:
由于汇编语言依赖于硬件体系,且助记符量大难记,于是人们又发明了更加易用的所谓高级语言。在这种语言下,其语法和结构更类似普通英文,且由于远离对硬件的直接操作,使得一般人经过学习之后都可以编程。高级语言通常按其基本类型、代系、实现方式、应用范围等分类。
汇编语言里#是什么意思 比如MOV A , #21H
呵呵 俺来帮你解答:
汇编语言里#是立即数的前缀
例如: MOV A ,抚#21H
#21H 表示21H是一个立即数 该指令是将立即数21H传送给累加器A.
汇编语言GE是什么指令
大于等于
汇编语言MOV指令是什么?
在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
例如:
MOV
AX,2000H;将16位数据2000H传送到AX寄存器
MOV
AL,20H;将8位数据20H传送到AL寄存器
MOV
AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV
AL,[2000H];将2000H单元的内容传送到AL寄存器
需要注意的是:
(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV
[SI],[2000H];这是错误的
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV
IP,2000
H
;这是错误的
(3)CS和IP不能作为目的操作数。MOV
CS,AX
;这是错误的
(4)MOV指令中立即数不能作目标操作数。MOV
2000H,[SI]
;这是错误的
汇编指令详解
MOV(MOVe) 传送指令
PUSH 入栈指令
POP 出栈指令
XCHG(eXCHanG) 交换指令
XLAT(TRANSLATE) 换码指令
LEA (Load Effective Address) 有效地址送寄存器指令
LDS(Load DS with pointer) 指针送寄存器和DS指令
LES(Load ES with pointer) 指针送寄存器和ES指令
LAHF(Load AH with Flags) 标志位送AH指令
SAHF(Store AH into Flgs) AH送标志寄存器指令
ADD 加法指令
ADC 带进位加法指令
INC 加1指令
SUB(SUBtract) 不带借位的减法指令
SBB(SuVtrach with borrow) 带借位的减法指令
DEC(DECrement) 减1指领
NEG(NEGate) 求补指令
CMP(CoMPare) 比较指令
MUL(unsinged MULtiple) 无符号数乘法指令
IMUL(sIgned MUL tiple) 有符号数乘法指令
DIV(unsigned DIVide) 无符号数除法指令
IDIV(sIgned DIVide) 有符号数除法指令
DAA 压缩的BCD码加法十进制调整指令
DAS 压缩的BCD码减法十进制调整指令
AAA 非压缩的BCD码加法十进制调整指令
AAS 非压缩的BCD码加法十进制调整指令
AND 逻辑与指令
OR 逻辑或指令
XOR 逻辑异或指令
NOT 逻辑非指令
TEST 测试指令
SHL(SHift logical Letf) 逻辑左移指令
SHR(SHift logical Right) 逻辑右移指令
ROL(Rotate Left ) 循环左移指令
ROR(Rotate Right) 循环右移指令
RCL(Rotate Left through Carry) 带进位循环左移
RCR(Rotate Right through Carry) 带进位循环左移
MOVS(MOVe String) 串传送指令
REP(REPeat) 重复操作前缀
CLD(CLear Direction flag) 清除方向标志指令
STD(SeT Direction flag) 设置方向标志指令
CMPS(CoMPare String) 串比较指令
SCAS(SCAn String) 串扫描指令
REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀
REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀
JMP(JuMP) 无条件转移指令
JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令
LOOP 循环指令P70
LOOPZ/LOOPE 为零/相等时循环指令
LOOPNZ/LOOPNE 不为零/不相等时循环指令
CALL 子程序调用指令
RET(RETun) 子程序返回指令
NOP(No OPeretion) 无操作指令
HLT(HaLT) 停机指令
OFFSET 返回偏移地址
SEG 返回段地址
EQU(=) 等值语句
DUP 操作数字段用复制操作符
SEGMENT,ENDS 段定义指令
ASSUME 段地址分配指令
ORG 起始偏移地址设置指令
$ 地址计数器的当前值
PROC,ENDP 过程定义语句
NAME,TITLE,END 程序开始结束语句
MACRO,ENDM 宏定义指令
汇编语言中的条件指令有哪些
无符号数条件转移指令
je/jz zf=1 若相等或为零则转移
jne/jnz zf=0 若不相等或不为零则转移
ja/jnbe cf=0 and zf=0 若高于或不低于等于则转移
jae/jnb cf=0 若大于等于或不低于则转移
jb/jnae cf=1 and zf=0 若小于或不大于等于则转移
jbe/jna cf=1 若小于等于或不大于则转移
有符号数条件转移指令
je/jz zf=1 若相等或为零则转移
jne/jnz zf=0 若不相等或不为零则转移
jg/jnle sf=of and zf=0 若大于或不小于等于则转移
jge/jnl sf=of 若大于等于或不小于则转移
jl/jnge sf!=of 若小于或不大于等于则转移
jle/jng sf!=of or zf=1 若小于等于或不大于则转移
特殊算数标志位的条件转移指令
jc cf=1 若有进位则转移
jnc cf=0 若无进位则转移
jo of=1 若有溢出则转移
jno of=0 若无溢出则转移
jp/jpe pf=1 若有偶数个1 则转移
jnp/jpo pf=0 若有奇数个1 则转移
js sf=1 若为负数则转移
jns sf=0 若为正数则转移
关于汇编语言中的LOOP指令
这个程序循环一次,是由CX存放的。 cx中存放的是循环的次数 编程计算2^12: assume cs:code code segment mov ax,2 mov cx,11 s:add ax,ax loop s mov ax,4c00h int 21h code ends end 执行loop s时,首先要将(cx)减1,若(cx)不为0,则前往s处执行add ax,ax。 CPU执行LOOP指令的时候,要进行两步操作: 1 (cx)=(cx)-1 2 判断cx中的值,不为零则转移到标号处执行程序,如果为零,则向下执行 例1 计算2^2 结果放在AX CODE SEGMENT ASSUME CS:CODE MOV AX,2 ADD AX,AX MOV AX,4C00H INT 21H code ENDS END 例2 计算2^3 结果放在AX CODE SEGMENT ASSUME CS:CODE MOV AX,2 ADD AX,AX ADD AX,AX MOV AX,4C00H INT 21H code ENDS END 扩展资料: 注意: 计算ffff:0-ffff:b单元中的数据之和,结果存储在dx中。 运算后的结果会不会查过dx所可以承受的存储范围。 ffff:0-ffff:b是字节型数据,范围在0-255,12个这样的数,即使都是255相加也不会超过65535 不可以直接将数据累加在dx中。 因为ffff:0-ffff:b是字节型数据8位,dx中存放16位数据。 不可以直接将数据累加到dl中,因为dl是8位寄存器,所容纳的数据的范围在0-255之间,ffff:0-ffff:b中的数据也都是8位,若仅向dl累加12个8位数据,可能会引起进位丢失的这种情况。