简单的汇编程序,简单的汇编程序代码
谁给我写一个最简单的汇编语言程序
............上来就是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