简单的汇编程序,简单的汇编程序代码

http://www.itjxue.com  2023-01-12 21:03  来源:未知  点击次数: 

谁给我写一个最简单的汇编语言程序

............上来就是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

AJMP MAIN

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

汇编简单程序

首先用notepad++编写一段汇编程序:?

这里我是在32位的windows系统下写的,学汇编推荐32位win因为自带debug可以试调,64位的要自己再安装(这里不再说明),如果想试用不同操作系统的同学,建议装个虚拟机,有关镜像文件可以从mdsn里面下。?

?

写了一段简单的伪代码对寄存器进行一些加法的操作。然后保存到桌面并命名为1.asm,这里还需要下一个masm,我下的是masm6.15。?

这里需要把masm6.15里面的link.exe,MASM.exe,ML.exe与刚刚保存的1.asm保存在一个地方?

然后打开cmd?

cd 到文件所在目录,输入masm 1.asm,程序即可运行;?

因为我们写的程序比较简单,并没有什么输出显示,所以你只会看到窗口只是闪了一下,这表明程序已经成功运行完了一次。

把下面 简单 汇编程序 加上详细注释

program segment

main proc far

assume cs:program

start:push ds ;这三条指令是为了能正确返回操作系统

sub ax,ax

push ax

input:mov ah,01 ;调用中断从键盘输入一个字符,字符的ASCII码在AL中

;mov ah,07

int 21h

cmp al,'q' ;比较输入的字符是否为'q',是则跳到标号quit

je quit

mov dl,al

mov ah,02 ;如果不是'q'则调用中断输出到屏幕

int 21h

jmp input ;跳到标号input继续输入字符

quit:ret ;退出程序

main endp

program ends

end start

2.输出十六进制1EC8

data_seg segment

DATAX dw 1CE8H

data_seg ends

code_seg segment

main proc far

assume cs:code_seg,ds:data_seg

start:

push ds ;这三条指令是为了能正确返回操作系统

sbb ax,ax

push ax

mov ax,data_seg ;将数据段的段地址放入DS中

mov ds,ax

mov bx,DATAX ;将变量DATAX中的数放入BX中

mov ch,4

rotate:

mov cl,4 ;CL中的数是为了使用移位指令,大小为移的位数

rol bx,cl;将BX中的数循环左移4位,即相当于把BX中高4位放在了低4位,移后

;的结果相当于CE81H(第一次)

mov al,bl;此时AL中为81H(第一次)

and al,0fh;将AL中的高4位清零即变成01H(第一次)

add al,30h;将AL加上30H得到数字的ASCII码

cmp al,3ah;比较AL中是否是数字,不是说明是字母A...F

jl print_it;是则跳到print_it直接输出

add al,7h;将AL再加7得到相应字母的ASCII码

print_it:

mov dl,al ;将数字输出到屏幕

mov ah,02h

int 21h

dec ch;循环次数减1

jnz rotate;若循环没结束则跳到totate继续执行

mov ah,07;等待输入,程序暂停

int 21h

ret ;程序结束

main endp

code_seg ends

end start

3.求1加2的和

data_seg segment

a db ?

b db ?

data_seg ends

code_seg segment

main proc far

assume cs:code_seg,ds:data_seg

start:push ds ;作用同以上程序

sub ax,ax

push ax

mov ax,data_seg

mov ds,ax

mov a,1 ;分别将变量a,b赋值1,2

mov b,2

mov al,a;将a的值放入AL中

add al,b;将AL中的值 与b相加,结果放在AL中

mov dl,al;相加结果放入DL中以便用中断输出

add dl,30h;得到数字的ASCII码

;or dl,30h

mov ah,2

int 21h;输出到屏幕

mov ah,07;程序暂停,等待按键,然后结束

int 21h

ret

main endp

code_seg ends

end start

如何编写最简单的汇编语言

首先明白编译环境:以上4个exe程序必须在32机中运行,若是64位机,请参照dosbox0.74(如何在64位机中使用debug)使用方法。

了解计算机CPU原理:详情请参照“80X86计算机组织”和“80X86的指令系统和寻址方式”

首先有一道题:

求表达式Y=A*X+B-C的值,已知A、B、C分别存放在DA-1、DA-2、DA-3字节单元,它们的值分别是:5 、 6、 7,X存放在INPUT字节单元,结果Y放入JSJ_10字节单元。

分析顺序结构程序代码:由记事本敲出来的

data segment?? ?da_1? db? 5?? ?da_2? db? 6?? ?da_3? db? 7?? ?input? db? 1?? ?jsj_10 db? 0data? ends????????????????????????????????????? ;这一段在内存中定义了一个段,叫做data,并且其中存入了5个变量并且付入初值,db代表每个变量占用1个字节,若是dd则为字,为2个字节code? segment????????????????????????????? ;名字叫做code的段的定义,显然这儿作为代码段,当然code这个名字可以更改???? assume? cs:code,ds:data????????????? ;指定data为DS数据段,code为CS代码段start:?????? mov ax,data????????????????????????????? ;加法指令?????? mov ds,ax????????????????????????????????? ;加法指令?????? mov al,da_1?????????????????????????????? ;加法指令

mov bl,input???????????????????????????? ;加法指令

mul bl??????????????????????????????????????? ;乘法?????? add al,da_2?????? sub al,da_3???????????????????????????????? ;减法?????? mov jsj_10,al

exit:? mov ah,4ch???????? int 21h???????????????????????????????????? ;这两行相当于ret(返回值),就像C语言中的return 0;

code ends?????? end start

注释: XXXX? segment

.............

XXXX ends???????????????????? ;定义一个段

assume? ds:XXXX?? 把XXXX段指定为ds(ds是段地址寄存器)

请先提前把masm edit debug link文件放入预定的文件夹,并把编写的xxxx.asm代码文件放入该文件夹,asm文件可用记事本写成,并改格式txt为asm(有的看不到文件后缀.txt的请参照百度)

打开cmd,并设置目录进入刚才的文件夹。

现在教如何使用edit编辑我们的asm文件

现在使用masm命令,借助masm.exe宏汇编程序将我们的asm文件翻译成obj二进制代码文件,若是过程中遇到错误,请用edit命令修改asm文件。

以上步骤之后,在文件夹中已经多出了生成的obj文件。此时需要将obj文件连接并生成exe可执行程序

于此,目录中又多出了exe文件。

在接下来这几步中,我们需要使用各种汇编指令进行程序调试。

接下来出现了,一个“-”,键入R查看数据,点击U反汇编,可以查看到将要执行的步骤

接下来便是执行程序,首先设置数据段。通过键入两次T(逐行执行命令)将data segment 设置为数据段。

这里,我们将各个步骤分别讲解

程序调试完毕,在来观察数据段中的值的情况。

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

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,

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

(责任编辑:IT教学网)

更多

推荐CSS教程文章