用汇编语言编写一个简单程序

用汇编语言编写一个简单程序,第1张

1.计算U=(X+(Y*Z-100))/W

其中:X,Y,Z,W均旅纯为十六位有符号数。

程序如下:

DATA

SEGMENT

X

DW

10

16位变量

Y

DW

20

Z

DW

30

W

DW

40

U

DW

?,?

DATA

ENDS

CODE

SEGMENT

ASSUME

CS:CODE,DS:DATA

START:

MOV

AX,DATA

MOV

DS,AX

MOV

AX,Y

IMUL

Z

计算Y*Z,内容放在DX,AX中拆亮咐

MOV

CX,AX

MOV

BX,DX

SUB

CX,100

计算Y*Z-100

SBB

BX,

0

MOV

AX,X

CWD

将X符号扩展,形成DX:AX中的双字

ADD

AX,CX

计算X+(Y*Z-100),内键如容放在DX,AX中

ADC

DX,BX

IDIV

W

计算(X+(Y*Z-100))/W

MOV

U,AX

MOV

U+2,DX

MOV

AH,4CH

INT

21H

CODE

ENDS

END

START

............上来就是LCD人家看得懂么......

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN:

MOV P0,#00H

MOV P1,#00H

MOV P2,#00H

MOV P3,#00H

ACALL DEL

MOV P0,#FFH

MOV P1,#FFH

MOV P2,#FFH

MOV P3,#FFH

ACALL DEL

AJMPMAIN

ORG 200H

DEL:MOV R5,#04H

DEL1:MOV R6,#0FFH

DEL2:MOV R7,#0FFH

DEL3:DJNZ R7,DEL3

DJNZ R6,DEL2

DJNZ R5,DEL1

ret

end

给新手的新手注释 :H表示地址 mov 是赋值的含义 R1,R2.....是寄存器,main相当于如碰C语言中主函数,是程 序的入口 0H~30H 一般用于存放中断函数无条件跳转语句(即为AJMP,SJMP,LJMP, 3者无条件跳转的地址量有限,LJMP最大(64Kbyte空间内语句可跳转),SJMP最小(-128H~+127H )) ,AJMP为2KByte无条件跳转

DEL 在该程序中表示延时函数,首先对寄存器R5,R6,R7赋值,R5*R6*R7*机器周期为延时时间 【 机器周期:12MHZ晶振=1us 6MHZ=2us】 执手神行完DEL中的MOV后 执行的是DJNZ命令,相当于C中i - -,不同的是若 i - -!=0,则跳转到 [DJNZ R...,()] 中()所代表的自定义函数{PS:DEL~DEL3均是是自定义函数,在延时函数里,为了达到延时值,一般都象我所写的那样 DEL: DJNZ R...,DEL 这样,i - -后又跳回来...,注意,在这里DEL,DEL1,...DEL3合起来叫做延时函数}

END表程序结束符(必须有)ACALL是表示调用子程序(这里,子函数是延时函数DEL)。。。。。与RET配套RET表返回调用子程序处

另外,该函数毕橡亏P0的点亮反映了共阴极合共阳极的不同,共阳极是MCU(即为单片机)接上若干发光二极管,并接电源VCC=+5V,如此一来,共阳极 熄灭整个一组端口FFH,点亮整个一组端口为00H 共阴极熄灭与点亮与共阳极恰起相反,因为共阴极MCU接上发光二极管后(从电路图看发光二极管上那一小竖道要面向GND而不是像共阳极那样面向MCU,当然在实际上也要注意接法的正负)接GND

ASSUME CS:CODE, DS:DATA

---------------------------------

DATA SEGMENT数据段

STRING01 DB 13, 10, 'January $'

CHANG EQU $ - STRING01

STRING02 DB 13, 10, 'February $'

STRING03 DB 13, 10, 'March $'

STRING04 DB 13, 10, 'April $'

STRING05 DB 13, 10, 'May $'

STRING06 DB 13, 10, 'June $'

STRING07 DB 13, 10, 'July $'

STRING08 DB 13, 10, 'August$'

STRING09 DB 13, 10, 'September $'

STRING10 DB 13, 10, 'October $'

STRING11 DB 13, 10, 'November $'

STRING12 DB 13, 10, 'December $'

X DB ?

TEMP DB ?

DATA ENDS

---------------------------------

CODE SEGMENT 代码段

START:

MOV AX, DATA

MOV DS, AX

--------------------------------

IN_LOOP:

MOV X, 0 数卜培漏据清零.

MOV CX, 2 输入2位

_INX:

MOV AH, 1 输入单个字中逗符.

INT 21H

--------------------------------

CMP AL, 13

JEEXIT_IN

CMP AL, '型烂0'

JB_IN_ERR 小于'0',不是数字.

CMP AL, '9'

JA_IN_ERR

SUB AL, '0' 还原为数字

MOV TEMP, AL 暂存

MOV AL, x

MOV BL, 10老数据乘以10

MUL BL

ADD AL, TEMP 加上新数据.

MOV x, AL保存.

LOOP _INX 继续输入.

JMP EXIT_IN

--------------------------------

_IN_ERR:

MOV DL, 8

MOV AH, 2

INT 21H

POP CX

JMP _INX

--------------------------------

EXIT_IN:

--------------------------------

MOV AL, x

CMP AL, 0

JEEXIT

CMP AL, 12

JAEXIT

DEC AL

LEA DX, STRING01

MOV BL, CHANG

MUL BL

ADD DX, AX

MOV AH, 9

INT 21H

EXIT:

MOV AH, 4CH结束程序

INT 21H

CODE ENDS

END START

---------------------------------

不想输入就输入<回车>,结束程序。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12260127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存