1、3.4 汇编语言程序格式,3.4.1 汇编语言程序格式 3.4.2汇编语言的数据与表达式 3.4.3伪指令 3.4.4宏指令 3.4.5程序设计 3.4.6汇编语言与C语言的接口,3.4 汇编语言程序格式,3.4.1 汇编语言程序结构 3.4.2 汇编语言语句类型和结构,返 回,1源程序的一般格式,STACK SEGMENT STACK ENDS DATA SEGMENT DATA ENDS CODE SEGMENTASSUME CS:CODE, DS: DATA, SS:STACK START: CODE ENDSEND START,例3-62 编写一个两字相加的程序。DSEG SEGMEN
2、T ;定义数据段 DATA1 DW 1234H ;定义被加数 DATA2 DW 5678H ;定义加数 DSEG ENDS ;数据段结束 ESEG SEGMENT ;定义附加段 SUM DW 2 DUP(?) ;定义存放结果区 ESEG ENDS ;附加段结束 CSEG SEGMENT ;定义代码段 ;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址ASSUME CS:CSEG,DS:DSEG,ES:ESEG START: MOV AX,DSEG ;START为程序开始执行的启动标号MOV DS,AX ;初始化DSMOV AX,ESEGMOV ES,AX ;初始化ESLEA SI,SUM
3、;存放结果的偏移地址送SIMOV AX,DATA1 ;取被加数ADD AX,DATA2 ;两数相加MOV ES:SI,AX ;和送附加段的SUM单元中HLT CSEG ENDS ;代码段结束END START ;源程序结束,例3-62 编写一个两字相加的程序。DSEG SEGMENT ;定义数据段 DATA1 DW 1234H ;定义被加数 DATA2 DW 5678H ;定义加数 DSEG ENDS ;数据段结束 ESEG SEGMENT ;定义附加段 SUM DW 2 DUP(?) ;定义存放结果区 ESEG ENDS ;附加段结束 CSEG SEGMENT ;定义代码段 ;下面的语句说明
4、程序中定义的各段分别用哪个段寄存器寻址ASSUME CS:CSEG,DS:DSEG,ES:ESEG START: MOV AX,DSEG ;START为程序开始执行的启动标号MOV DS,AX ;初始化DSMOV AX,ESEGMOV ES,AX ;初始化ESLEA SI,SUM ;存放结果的偏移地址送SIMOV AX,DATA1 ;取被加数ADD AX,DATA2 ;两数相加MOV ES:SI,AX ;和送附加段的SUM单元中HLT CSEG ENDS ;代码段结束END START ;源程序结束,2源程序的结构特点,(1)汇编语言程序通常由若干段组成,段由伪指令SEGMENT与ENDS定义
5、,各段顺序任意,段的数目按需要确定,原则上不受限制。(2)段由若干语句组成,语句以指令为主体而构成。一条语句写在一行上,书写时语句的各部分应尽量对齐(3)汇编语言程序中至少要有一个启动标号,作为程序开始执行时目标代码的入口地址。启动标号常用START、BEGIN、MAIN等命名。(4)为增加程序的可读性,可在汇编语言语句“;”后加上注释。,返 回,3.4.2汇编语言语句类型及格式,1汇编语言语句的类型 (1)指令语句是可执行语句,在汇编中要产生对应的目标代码,CPU根据这些代码才能执行相应的操作。 (2)伪指令语句是不可执行语句,在汇编中不产生目标代码,用于指示汇编程序如何汇编源程序,利用它定
6、义和说明常量和变量的属性及存储器单元的分配等。 (3)宏指令语句是以一个宏名定义的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入。2语句的格式标号: 操作数 ;注释符号名 操作数 ;注释,返 回,3.4.2汇编语言的数据与表达式,3.4.2.1常量、变量与标号 3.4.2.2表达式与运算符,3.4.3.1 常量、变量与标号,1常量 数值常量、字符串常量、符号常量 2变量 例4-2用数据定义伪指令DB、DW、DD定义变量 DATA SEGMENT DA1 DB 12H ;定义一个字节数据 DA2 DD 0FEDCBA90H ;定义一个双字数据 DA3 DW
7、 5678H ;定义一个字数据 DATA ENDS 3标号 标号是一条指令的符号地址。在无条件转移指令、条件转移指令、循环指令和子程序调用指令的操作数位置上,通常用标号作为程序转移指令的目标地址。,例题,例 逻辑运算符的应用 MOV AL,NOT 10101010B ;(AL)01010101B MOV AL,11110000B AND 10111101B ;(AL)10110000B MOV AL,10100000B OR 00000101B ;(AL)10100101B 例 关系运算符的应用 MOV AX,5 EQ 101B ;(AX)0FFFFH MOV BH,10H GT 16 ;(B
8、H)0 例 数值返回运算符的应用 K1 DB 30H,31H,32H K2 DW 4041H,4043H K3 DW 20H DUP(0) K4 DD 50515253H MOV AL,TYPE K1 ;等效于MOV AL,1 MOV AH,TYPE K2 ;等效于MOV AH,2 MOV AL, LENGTH K3 ;(AL)20H,返回DUP前面的数值 MOV CL, LENGTH K4 ;(CL)01H MOV BL, SIZE K3 ;(BL)40H MOV DL, SIZE K4 ;(DL)04H,3.4.3.4 表达式与运算符,1算术运算符 算术运算符包括加(+)、减(-)、乘(*
9、)、除(/)、求余(MOD)、左移(SHL)和右移(SHR)共七种。 2逻辑运算符 逻辑运算符包括AND(与)、OR(或)、XOR(异或)、NOT(非)共四种,它们只适用于对常量进行逻辑运算。,3关系运算符 关系运算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、 GE(大于等于)共六种。 4数值返回运算符 数值返回运算符包括SEG(段基址)、OFFSET(偏移量)、TYPE(类型),LENGTH、SIZE,运算的对象是存储器操作数,返回变量或标号的属性值。 5修改属性运算符,高 级,例题,例 逻辑运算符的应用 MOV AL,NOT 10101010B ;(AL
10、)01010101B MOV AL,11110000B AND 10111101B ;(AL)10110000B MOV AL,10100000B OR 00000101B ;(AL)10100101B,例题,例 关系运算符的应用 MOV AX,5 EQ 101B ;(AX)0FFFFH MOV BH,10H GT 16 ;(BH)0,例题,例 数值返回运算符的应用 K1 DB 30H,31H,32H K2 DW 4041H,4043H K3 DW 20H DUP(0) K4 DD 50515253H MOV AL,TYPE K1 ;等效于MOV AL,1 MOV AH,TYPE K2 ;等效
11、于MOV AH,2 MOV AL, LENGTH K3 ;(AL)20H,返回DUP前面的数值 MOV CL, LENGTH K4 ;(CL)01H MOV BL, SIZE K3 ;(BL)40H MOV DL, SIZE K4 ;(DL)04H,例题,例 段属性运算符的应用 MOV AX,ES:BX ;用附加段ES取代默认的数据段DS MOV BL,DS:BP ;用数据段DS取代默认的堆栈段SS 例 PTR运算符的应用 N1 DB 3,6,9 MOV AX,WORD PTR N1 ;临时指定N1为字类型,(AX)0603H 例 THIS运算符的应用 ABC EQU THIS BYTE ;从
12、本语句开始变量ABC的类型属性指定为字节,不管它原来的类型是什么 例 HIGH和LOW运算符的应用 NUM EQU 2456H MOV AL,HIGH NUM ;等效于 MOV AL,34H MOV BL,LOW NUM ;等效于 MOV BL,56H,返 回,3.5伪指令,3.5.1 符号定义伪指令 3.5.2 数据定义伪指令 3.5.3 段定义伪指令 3.5.4 段寻址伪指令 3.5.5 过程定义伪指令 3.5.6 模块定义与连接伪指令 3.5.7 其它伪指令,3.5.1 符号定义伪指令,1等值语句 例4-10 等值语句 CR EQU 0DH ;常量 TEN EQU 0AH ;常量 AA
13、EQU ASCII_TABLE ;变量 VAR EQU TEN*2+1024 ;数值表达式 ADR EQU ES:BP+DI+5 ;地址表达式 GOTO EQU JMP ;指令助记符 2等号语句 例4-11 等号语句 NUM=488 ;定义NUM等于488 NUM=NUM+1 ;定义NUM等于489,返 回,3.5.2 数据定义伪指令,例4-12 DATA DB 11H,33H ;定义包含两个元素的字节变量DATA NUM DW 100*5+88;定义一个字类型变量NUM,其初值为表达式的值 SUM DQ 0011223344556677 ;将4个字存入变量SUM。例4-13 STR1 DB
14、COMPUTER ;定义一个字符串,字符串的首地址为STR1 STR2 DW AA,BC,DE ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元例4-14DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H,返 回,3.5.3 段定义伪指令,格式: 段名 SEGMENT 定位类型 组合类型 类别名 段名 ENDS 1段名 一个段开始和结尾
15、的段名必须一致,否则会出现语法错误 2定位类型 (1)BYTE (2)WORD (3)PARA (4)PAGE 3组合类型 (1)NONE (2)PUBLIC (3)COMMON (4)STACK (5)MEMORY (6)AT表达式 4. 类别名,返 回,3.5.4 段寻址伪指令,格式: ASSUME 段寄存器名:段名,段寄存器名:段名, 例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ? DATA EN
16、DS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK,BEGIN: MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXLEA SI,NUM MOV CX,12 XOR AX,AXNEXT: ADD ALSI ADC AH,0 INC SILOOP NEXT MOV SUM,AX HLT CODE ENDS END BEGIN,返 回,3.5.5 过程定义伪指令,格式: 过程名 PROC NEAR/FARRETRE
17、T过程名 ENDP,例4-16 编写一个延时50ms的子程序DELAY PROC ;定义一个近过程PUSH BX ;保护BX原来的内容PUSH CX ;保护CX原来的内容MOV BL,5 ;外循环次数 NEXT: MOV CX,2801 ;内循环次数(实现延时10ms) W10MS:LOOP W10MS ;(CX)0则循环DEC BL ;修改外循环计数值JNZ NEXT ;(BX)0则进行外循环 POP CX ;恢复CX原来的内容 POP BX ;恢复BX原来的内容RET ;过程返回 DELAY ENDP ;过程结束,返 回,3.6.6 模块定义与连接伪指令,1模块定义伪指令 格式:NAME
18、标识符END 启动标号 2模块连接伪指令 (1)全局符号伪指令 格式:PUBLIC 符号名1,符号名2, (2)引用伪指令 格式:EXTRN 符号名1:类型,符号名2:类型,,例题,例4-17 编程利用乘法模块计算X*Y。NAME MAINCALL ;主模块EXTRN WMUL:FAR STACK SEGMENT PARA STACK STACKDB 100 DUP(?) STACK ENDS DATA SEGMENT PARA DATA X DW 3355H Y DW 8866H DATA ENDS CODE SEGMENT PARA CODE MAIN PROC FARASSUME CS:
19、CODE,DS:DATA,SS:STACKPUSH DSMOV AX,0PUSH AXMOV AX,DATA,MOV DS,AXMOV AX,XMOV BX,YCALL WMUL ;调用外部过程WMULRET MAIN ENDP CODE ENDSEND MAIN ;主模块结束 NAME SUBMUL ;子模块 CDESG SEGMENT PARA CODE WMUL PROC FAR ;定义远过程WMULASSUME CS:CDESGPUBLIC WMUL ;定义WMUL为全局过程名CALL MULAB ;嵌套调用RET ;过程返回 WMUL ENDP ;过程结束 MULAB PROC ;定
20、义一个近过程MULABMUL BXRET MULAB ENDP ;过程结束 CDESG ENDS ;代码段结束END ;子模块结束,返 回,3.5.7 其它伪指令,1定位伪指令 例4-20 伪指令ORG和当前位置计数器值符号$的应用 DATA SEGMENTORG 30H DB1 DB 12H,34HORG $ +20H STRING DB STRING DATA ENDS 2方式选择伪指令 8086 ;汇编程序只接受8086/8088的指令,这是默认方式 286 ;汇编程序接受8086/8088及286的指令 286P ;除与286功能相同之外,汇编程序还接受286保护方式下的指令 386
21、,386P ,486 ,486P含义类推, 586 ;汇编程序接受8086/8088、286、386、486及586的指令 586P ;除与586功能相同之外,汇编程序还接受586保护方式下的指令 3简化的段定义伪指令 DOSSEG ;标记简化段,各段顺序由系统安排,用于主模块前面 MODEL SMALL;指明内存使用模式,指示数据与代码允许使用的长度 DATA ;定义数据段,隐含段名为DATA STACK长度 ;定义堆栈段,隐含段名为STACK,并形成SS及SP初值 CODE名字 ;定义代码段,隐含段名为CODE END ;汇编结束,返 回,3.5.7 宏命令伪指令,1宏定义 例4-18 用
22、宏指令定义两个字节数相加,结果存入RESULT单元的操作。 ADDM MACRO OPR1,OPR2,RESULT MOV AL,OPR1ADD AL,OPR2MOV RESULT,ALENDM 2宏调用 例4-19 将例4-18中的宏定义进行宏调用、宏展开操作如下: ADDM 88,36,SUM ADDM BR,TAB,SUM,宏展开: + MOV AL,88 + ADD AL,36 + MOV SUM,AL + MOV AL,BR + ADD AL,TAB + MOV SUM,AL 4宏的取消 PURGE,返 回,3.6 汇编语言程序上机过程,3.6.1 建立汇编语言的工作环境 3.6.2
23、 上机操作过程 3.6.3 DEBUG的使用方法,返 回,3.6.1 建立汇编语言的工作环境,编辑程序,文件名 EDIT.COM 汇编程序,文件名 MASM.EXE 连接程序,文件名 LINK.EXE 调试程序,文件名 DEBUG.EXE LIB.EXE,库管理程序 CREF.EXE,符号索引文件处理程序 EXE2BIN.EXE,将EXE转换为COM的文件格式转换程序,返 回,3.6.2 上机操作过程,1编辑 1.对编辑完成的源程序在存盘时扩展名必须加写.ASM 2.一定要严格遵守汇编语言书写格式及段结构的格式来编写程序 2汇编 汇编过程就是将汇编语言源程序转换成机器能够识别的目标代码程序,即
24、OBJ的二进制文件。还可生成扩展名为.LST的列表文件,扩展名为.CRF的符号索引文件。 3连接 所谓连接是用连接程序LINK.EXE把若干个经汇编后产生的.OBJ文件及指定的库文件连接起来,产生可执行的.EXE文件。 4调试,返 回,3.6.3 DEBUG的使用方法,1DEBUG的运行 2DEBUG的主要命令 D,显示内存单元内容; U,反汇编命令; R,显示与修改寄存器内容; E,修改内存单元内容; A,汇编命令; T、P,单步执行指令; G,连续执行指令; N,指定装入文件名或写入文件名; L,装入N指定的文件; W,将指定内容写入N指定的文件; Q,退出DEBUG程序,返回操作系统状态
25、。,返 回,3.7 程序设计,3.7.1 程序设计步骤 3.7.2基本结构程序设计 3.7.3子程序设计 3.7.4程序设计举例,返 回,3.7.1程序设计步骤,(1)分析问题 (2)建立数学模型 (3)确定算法。 (4)绘制流程图 (5)分配内存空间 (6)编制程序与静态检查。 (7)上机调试 (8)试运行和分析结果 (9)整理资料投入运行,返 回,3.7.2 基本结构程序设计,顺序结构 分支结构 循环结构,顺序结构程序设计,例3-82 编写程序,计算(W-(X*Y+Z-100)/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。DATA SEGMENT W DW
26、 268 X DW 73 Y DW 48 Z DW 85 DATA ENDS STACK SEGMENT DW 100 DUP(?) STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,X ;计算X*YIMUL YMOV CX,AX ;用CX存储结果低位MOV BX,DX ;用BX存储结果高位MOV AX,Z ;计算X*Y+Z,CWDADD CX,AXADC BX,DXSUB CX,100SBB BX,0MOV AX,WCWD SUB AX,CXSBB DX,BXIDIV
27、 WMOV AH,4CHINT 21HCODE ENDSEND START,例题,例3-83 把非压缩十进制数DAT1转换为压缩十进制数。DOSSEGMODEL SMALLSTACK 64HDATADAT1 DW 0908H ;非压缩十进制数0908HCODE BEGIN: MOV AX,DATA MOV DS,AX MOV AX,DAT1 ;AX0908HMOV CL,4 ;CL 4SAL AH,CL ;09字节左移4位,AH=90HROL AX,CL ;9008H字循环左移4位,AX=0089HROL AL,CL ;89字节循环左移4位,AL=98HMOV BYTE PTR DAT1,AL
28、 ;DAT198H,压缩十进制数98HMOV AH,4CH ;返回DOSINT 21HEND BEGIN,返 回,分支结构程序设计,两路分支程序设计,例3-84 用比较指令和条件转移指令实现两路分支的程序段。MOV AX,M ;假定M和N为有符号数MOV BX,NCMP AX,BX ;比较 M和N的大小,影响标志位,准备条件JG NEXT ;MN时转移,注意若M、N为无符号数时用JA指令 ;分支程序2JMP DONE NEXT: ;分支程序1 DONE:RET,例题,例 3-85 已知X是单字节带符号数,请设计计算下列表达式的程序。Y= 程序如下:DATA SEGMENTX DB ?Y DB
29、? DATA ENDS CODE SEGMENT ;代码段 START:PROC FAR ASSUME CS:CODE,DS:DATAPUSH DS ;保存返回地址MOV AX,0,PUSH AXMOV AX,DATA ;初始化DSMOV DS,AXMOV AL,X ;取数XCMP AL,0 ;准备条件JNS PLUS ;X0则转移NEG AL ;X0则求补JMP DONE PLUS: ADD AL,20 ;X0时,X+20 DONE: MOV Y,AL ;计算结果送YRET ;返回 START ENDP CODE ENDSEND START ;汇编结束,多路分支程序设计,例题,例3-86 假
30、设某企业有10类人员,对每类人员的工资各有不同的处理方法和计算程序。对于一类人员应执行程序段CLASS1,二类人员应执行程序段CLASS2,十类人员应执行程序段CLASS10。,程序,DATA SEGMENT TABLE DW CLASS1,CLASS2,CLASS3,CLASS4,CLASS5DW CLASS6,CLASS7,CLASS8,CLASS9,CLASS10 NUM DB ? DATA ENDS STACK SEGMENT STACKDW 100 DUP(?) STACK ENDS CODE SEGMENT MAIN PROC FARASSUME CS :CODE,DS:DATA,
31、SS:STACK START:PUSH DSSUB AX,AXPUSH AXMOV AX,DATA,MOV DS,AX MOV AL,NUM MOV AH,0 SHL AX SUB AX,2 LEA BX,TABLE ADD BX,AX JMP BX CLASS1: CLASS2: CLASS10: RET MAIN ENDP CODE ENDS END START,返 回,循环结构程序设计,例题,例3-87 把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。,DSEG SEGMENTBUF DW 80 DUP(?) DSEG ENDSCSEG SEGMENTASSUME CS:C
32、SEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXLEA DI,MEMMOV BL,79LOOP1:MOV SI,DIMOV CL,BL,LOOP2:MOV AX,SIADD SI,2CMP AX,SIJNC NEXTMOV DX,SIMOV SI-2,DXMOV SI,AXNEXT: DEC CLJNZ LOOP2 DEC BL JNZ LOOP1 MOV AH,4CHINT 21HCSEG ENDSEND START,返 回,3.7.5 子程序设计,例4-27 通过寄存器传递参数,将数据块BUF1中的内容传递到数据块BUF2中DATA SEGMENTBUF1 DB
33、11,22,33,99CUNT EQU $-BUF1BUF2 DB CUNT DUP(?)DATA ENDSSTACK SEGMENTTOS DW 128H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK,MOV SS,AXMOV SP,OFFSETLEA SI,BUF1LEA DI,BUF2MOV CX,CUNTCALL SUB1 SUB1 PROC DON: MOV AL,SIMOV DI,ALINC SIINC DILOOP DON RET
34、SUB1 ENDPMOV AH,4CHINT 21H CODE ENDSEND START,例题,例3-88 当I/O状态端口0378H的Bit1(D1位)为0时,表示外设忙;为1则表示外设可以接收数据。试编程根据外设的状态将当前数据段中从BUFFER开始的连续100个字节的内容从I/O数据端口03F8输出到外设SDATA PROC FARPUSH AXPUSH DXPUSH SIPUSH CXLEA SI,BUFFERMOV CL,100 AGAIN: MOV DX,378HWAIT: IN AL,DXTEST AL,02H JZ WAIT,MOV AL,SIMOV DX,3F8HOUT D
35、X,ALINC SIDEC CLJNZ AGAINPOP CXPOP SIPOP DXPOP AXRET SDATA ENDP MOV AX,DATA MOV DS,AX CALL SDATA,返 回,3.7.6 程序设计举例,例3-90 把一个二进制数转换为BCD码。DATA SEGMENT NBIN DW 5678H NBCD DB 5 DUP(?) DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV AX,NBINLEA BX,NBCDXOR DX,DXMOV CX,OAHDIV CX MO
36、V BX,DL,MOV DL,0DIV CXINC BXMOV BX,DLMOV DL,0DIV CXINC BXMOV BX,DLMOV DL,0DIV CXINC BXMOV BX,DLINC BXMOV BX,DL MOV AH,4CHINT 21H CODE ENDSEND START,例题,例3-91 两个32位带符号数的乘法,例3-92 编程实现图3-17所示逻辑电路的功能。,返 回,DATA SEGMENT A DB 65H B DB 33H C DB 08H D DB 0FH E DB ? DATA ENDS STACK SEGMENT PARA STACK STACKDB 1
37、00 DUP(?) STACK SEGMENT,CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DDMOV DS,AXNOT AMOV AL,BOR AL,AAND BL,DNOT ALMOV E,ALMOV AH,4CHINT 21H CODE ENDSEND BEGIN,3.8 汇编语言与C语言的接口,3.8.1汇编语言与高级语言接口 3.8.2混合编程,3.8.1汇编语言与高级语言接口,汇编语言与高级语言接口时,需要解决两个问题: 1 调用与被调用 被调用的过程或函数应预先说明为外部类型,如用PUBLIC说明汇编子程序被外
38、部模块调用;调用程序则要说明要引用的外部模块名。 2 参数传递 汇编语言与高级语言一般用堆栈来实现参数的传递,因此,必须了解各种语言的堆栈结构、生成方式和入栈方式等。BASIC,FORTRAN,PASCAL等语言其参数进栈顺序与参数在参数表中出现的顺序相同,即从右到左,而C语言则相反。,3.8.2 混合编程,1. C语言调用汇编 2. C语言嵌入汇编,1. C语言调用汇编,例4-30 用C语言调用汇编语言,实现两个数求和。 ;C语言程序段CAL.C #INCLUDE “STDIO.H” #INCLUDE “STDLIB.H” int result; extern sum(int i, int
39、j, int *r); main(void) int i, j; printf(“enter two number:”); scanf(“%d,%d”, ,;汇编语言程序段_SUM.ASM,完成两数相加 PUBLIC_SUM _CODE SEGMENT ASSUME CS:CODE _SUM PROC NEAR PUSH BP MOV BP,SP MOV AX,BP+4 ADD AX,BP+6 MOV DI,BP+8 MOV DI,AX POP BP RET _SUM ENDP _CODE ENDS END,2. C语言嵌入汇编,在C语言程序中直接编写汇编语言代码,称为嵌入汇编。C程序中嵌入汇编后可以无分号(C语言的语句以分号结束,汇编语句是C语言中唯一以换行结束的语句),以关键词ASM声明一个嵌入汇编指令,如需多个ASM语句,可以将它们放在花括号内,如: ASM ADD AX,BX ASM DIV BX PUSH AX MOV AX,0,谢谢!,