DATAS SEGMENT ;定义⼀个DATAS段 X DW 3 ;给字变量X赋值,X占16位 Y DW 2 ;给字变量Y赋值,Y占16位 STR1 DB 'X = $' ;⽤于输出的表达式字符串,下同理 STR2 DB 'Y = $' STR3 DB 'X + Y = $' STR4 DB 'X - Y = $' STR5 DB 'X * Y = $' STR6 DB 'X / Y = $' STR7 DB '...$' ;余数的表达形式,如:5/2=2...1 DATAS ENDS ;DATAS段结束
CODES SEGMENT ;定义⼀个CODES段 START: ;程序开始标号处 MOV AX,DATAS ;先将段DATAS中⽴即数存到通⽤寄存器AX中作为中转 MOV DS,AX ;将⽴即数送到段寄存器DS中 ;输出"X = " LEA DX,STR1 ;调⽤字符串STR1开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出X的值 MOV DX,X ;将X的值存放在DX寄存器中 ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出回⻋换⾏ MOV DL,10 ;输出回⻋换⾏,回⻋键ACSII值为10 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出"Y = " LEA DX,STR2 ;调⽤字符串STR2开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出Y的值 MOV DX,Y ;将Y的值存放在DX寄存器中 ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出回⻋换⾏ MOV DL,10 ;输出回⻋换⾏,回⻋键ACSII值为10 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出"X + Y = " LEA DX,STR3 ;调⽤字符串STR3开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出X+Y的值 MOV DX,X ;将X的值存放在DX中 ADD DX,Y ;将X和Y相加,结果存放在DX中 ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出回⻋换⾏ MOV DL,10 ;输出回⻋换⾏,回⻋键ACSII值为10 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出"X - Y = " LEA DX,STR4 ;调⽤字符串STR4开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出X-Y的值 MOV DX,X ;将X的值存放在DX中 SUB DX,Y ;将X和Y相减,结果存放在DX中 ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出回⻋换⾏ MOV DL,10 ;输出回⻋换⾏,回⻋键ACSII值为10 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出"X * Y = " LEA DX,STR5 ;调⽤字符串STR5开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出X*Y的值 MOV AX,X ;MUL乘法指令中⼀个乘数在AL寄存器中 MUL Y ;Y为另⼀个乘数,X*Y的结果存放在了AX寄存器中 MOV DX,AX ;将AX中的乘积内容送到DX中⽤于输出 ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出回⻋换⾏ MOV DL,10 ;输出回⻋换⾏,回⻋键ACSII值为10 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出"X / Y = " LEA DX,STR6 ;调⽤字符串STR6开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出X/Y的商值 XOR DX,DX ;做16位除法前需要将DX清零 MOV AX,X ;DIV除法指令中16位被除数在AX寄存器中 DIV Y ;Y为除数,X/Y的结果16位商存放在AX中,余数存放在DX中,(如果是8位,商存放在AL中,余数在AH中) MOV DX,AX ;将AX中的商值内容送到DX中⽤于输出 ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 ;输出"..." LEA DX,STR7 ;调⽤字符串STR7开始有效地址(偏移地址),存放在寄存器DX中 MOV AH,09H ;调⽤DOS系统9号功能:显示字符串 INT 21H ;调⽤DOS功能中断 ;输出X/Y的余数值 XOR DX,DX ;由于DL中值已被覆盖,重新进⾏⼀次除法运算 MOV AX,X ;DIV除法指令中16位被除数在AX寄存器中 DIV Y ;Y为除数,X/Y的结果16位商存放在AX中,余数存放在DX中,(如果是8位,商存放在AL中,余数在AH中) ADD DL,'0' ;把数字变成字符输出,因为汇编中只能输出字符;0的ASCII值是30H,数字加上'0'后变为字符 MOV AH,02H ;调⽤DOS系统的02号功能:显示⼀个字符 INT 21H ;调⽤DOS功能中断 MOV AH,4CH ;调⽤DOS系统4C号功能:结束程序 INT 21H ;调⽤DOS功能中断 CODES ENDS ;CODES段结束 END START ;汇编程序运⾏结束
#include"stdio.h" longadd(long a, long b) { long x = a, y = b; return (x + y); } intmain(int argc, char* argv[]) { long a = 1, b = 2; printf("%d\n", add(a, b)); return0; }
啊这……..就不分析啦
1 2 3 4 5 6 7 8 9 10 11 12 13 14
intMyFunction(int x, int y, int z) { int a, b, c; a = 10; b = 5; c = 2; ... } intTestFunction() { int x = 1, y = 2, z = 3; MyFunction1(1, 2, 3); ... }