汇编程序设计实例

合集下载

8086汇编语言程序设计——第一个程序

8086汇编语言程序设计——第一个程序

8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。

Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。

汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。

学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。

⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。

假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。

D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。

1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。

伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。

⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。

汇编语⾔程序建⽴及汇编过程如图所⽰。

⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。

注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。

执⾏MASM和LINK命令时需要按多次回车。

3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。

汇编编程实例

汇编编程实例
mov ah,10
int 21h
mov cl, [buf+1]
lea di,buf+2
call datacate
call ifyears
jc a1
yjw1: JMP B1
A2: MOV DL,WW ;显示'-'
MOV AH,2
INT 21H
mov cx,65535
mai1: loop mai1
CALL RAND1
CALL MCAT
loop l1
ret
datacate endp
ifyears proc near
push bx
push cx
push dx
mov ax,w
PUSH AX
STI
MOV AH,0
INT 1AH
MOV ax,cx
AND AH,3
MOV DL,101
DIV DL
MOV BL,AH
POP AX
POP DX
PUSH CX
PUSH DX
mov ax,bx
mov bl,5
div bl
cmp ah,3
jae vb1
mov www,1
jmp vn1
vb1:mov www,0
vn1:pop dx
pop cx
案例1判断闰年程序
data segment ;定义数据段
infon db 0dh,0ah,'Please input a year: $'
Y db 0dh,0ah,'This is a leap year! $'

汇编程序设计举例

汇编程序设计举例
② 循环体:重复运行的部分,其中还包含了工作部分和循环控 制部分。工作部分进行相应的操作,而循环控制部分则保证在不满足 循环条件时,跳出循环。
③ 循环结束条件:在循环体中包括了循环结束条件运算部分。 每循环一次除了工作部分进行相应的操作外,循环条件部分还要通过 运算,得出当前循环的状态,以便在适当的条件下结束循环。
2. 循环的类型
循环体的结构依照问题的不同,一般可以分为 两种类型:
① 先判断后处理 ② 先处理后判断
3. 控制循环次数的方法
有三种:用计数控制循环,用条件控制循环和用 逻辑变量控制循环。其中,前两种方法用的最多。 ①用计数控制循环
对于循环次数已知的程序,或是在进入循环前可 由某变量确定循环次数的程序,通常用计数器来控 制循环。(用LOOP指令)
(1)利用寄存器。这是一种最常见方法,把所 需传递的参数直接放在主程序的寄存器中传递 给子程序。
(2)利用存储单元。这种参数传递方法,把所 需传递的参数直接放在子程序调用指令代码之 后。
(3)利用堆栈。这种方法将参数压入堆栈,在 子程序运行时从堆栈中取参数。
[例2] 求绝对值 求AX寄存器和BX寄存器中两个无符号数之差
的绝对值,结果放在内存(偏移地址为2800)单元 中。
分析:利用比较指令,判断谁大谁小,然后大 数减小数。
CLC SUB AX,BX JC AA MOV DI,2800H MOV [DI],AX JMP EXIT AA: SUB BX,AX MOV DI,2800H MOV [DI],BX EXIT: MOV AH,4CH INT 21H
1 x>0
[例3] 有一符号函数如下 y=f(x)= 0 x=0
开始
-1 x<0

单片机汇编语言经典一百例

单片机汇编语言经典一百例

单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。

在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。

本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。

1. 点亮LED灯```ORG 0x0000 ; 程序起始地址MOV P1, #0xAA ; P1口输出高电平,LED灯点亮END ; 程序结束```2. LED流水灯效果```ORG 0x0000 ; 程序起始地址MOV P1, #0x01 ; P1口输出低电平,第一个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x02 ; P1口输出低电平,第二个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x04 ; P1口输出低电平,第三个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x08 ; P1口输出低电平,第四个LED点亮CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```3. 数码管动态扫描显示```ORG 0x0000 ; 程序起始地址CLR P0.0 ; P0.0口输出低电平,选择第一个数码管MOV P2, #0x7E ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.1 ; P0.1口输出低电平,选择第二个数码管MOV P2, #0x30 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.2 ; P0.2口输出低电平,选择第三个数码管MOV P2, #0x6D ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.3 ; P0.3口输出低电平,选择第四个数码管MOV P2, #0x79 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。

汇编语言程序设计实例

汇编语言程序设计实例

汇编语言程序设计实例汇编语言是一种非常底层的编程语言,它允许程序员直接与计算机硬件进行交互。

汇编语言程序设计通常用于需要高性能或者对硬件有特定需求的场合。

以下是一些汇编语言程序设计的实例,以帮助理解其基本结构和应用。

实例一:数据传输在汇编语言中,数据传输是最基本的操作之一。

以下是一个简单的数据传输程序实例,它将一个立即数(即直接给出的数值)移动到寄存器中:```assemblymov ax, 1234h ; 将十六进制数1234h移动到ax寄存器```实例二:算术运算汇编语言支持基本的算术运算,如加法、减法、乘法和除法。

以下是一个进行加法运算的例子:```assemblymov ax, 5 ; 将数值5移动到ax寄存器add ax, 3 ; 将数值3加到ax寄存器中```实例三:条件跳转条件跳转是控制程序流程的重要手段。

以下是一个基于条件跳转的简单程序,它检查ax寄存器的值是否为0,并根据结果跳转到不同的代码段:```assemblymov ax, 0 ; 将数值0移动到ax寄存器jz zero ; 如果ax为0,则跳转到标签zero; 继续执行其他代码...zero:; 如果ax为0,执行这里的代码```实例四:循环结构循环结构在汇编语言中实现起来较为复杂,但可以通过重复使用跳转指令来模拟。

以下是一个简单的循环结构实例,它将ax寄存器的值减1,直到值为0:```assemblystart_loop:dec ax ; 将ax寄存器的值减1jnz start_loop ; 如果ax不为0,跳回start_loop```实例五:字符串处理汇编语言程序设计中,字符串处理是一个常见的任务。

以下是一个将字符串从源地址复制到目标地址的程序:```assemblymov si, source ; 将源字符串的地址移动到si寄存器mov di, dest ; 将目标地址移动到di寄存器mov cx, length ; 将字符串的长度移动到cx寄存器copy_loop:movsb ; 从si复制一个字节到diloop copy_loop ; 减少cx的值并重复循环直到cx为0```实例六:子程序调用在汇编语言中,子程序是一种将代码封装成模块化单元的方法。

汇编编程实例

汇编编程实例

汇编编程实例.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。

别把虾米不当海鲜。

案例1判断闰年程序data segment ;定义数据段infon db 0dh,0ah,'Please input a year: $'Y db 0dh,0ah,'This is a leap year! $'N db 0dh,0ah,'This is not a leap year! $'w dw 0buf db 8db ?db 8 dup(?)data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,axlea dx,infon ;在屏幕上显示提示信息mov ah,9int 21hlea dx,buf ;从键盘输入年份字符串mov ah,10int 21hmov cl, [buf+1]lea di,buf+2call datacatecall ifyearsjc a1lea dx,nmov ah,9int 21hjmp exita1: lea dx,ymov ah,9int 21hexit: mov ah,4chint 21hdatacate proc near;push cx; dec cxlea si,buf+2tt1: inc siloop tt1;lea si,cx[di]pop cxmov dh,30hmov bl,10mov ax,1l1: push axsub byte ptr [si],dhmul byte ptr [si]add w,axpop axmul bldec siloop l1retdatacate endpifyears proc nearpush bxpush cxpush dxmov ax,wmov cx,axmov dx,0mov bx,4div bxcmp dx,0jnz lab1mov ax,cxmov bx,100div bxcmp dx,0jnz lab2mov ax,cxmov bx,400div bxcmp dx,0jz lab2lab1: clcjmp lab3lab2: stclab3: pop dxpop cxpop bxretifyears endpcode endsend start案例2产生随机数并运算的程序DATA SEGMENTCC DB '+'ww db '-'GG DB '='II DB 0DH,0AH,'$'AA DB 5 DUP(?)www dw 0ghh db '0',0dh,0ah,'$'bnm dw 0DATA ENDSSTACK SEGMENTDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,20CALL RAND ;产生一随机数CALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV AX,BXPUSH AXCMP www,0 ;WWW=0?JE A1 ;执行'+'CMP www,1 ;www=1?JE A2 ;执行'-'A1: MOV DL,CC ;显示'+'MOV AH,2INT 21HCALL RAND ;产生另一随机数add bx,0fhCALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV DL,GG ;显示'='MOV AH,2INT 21HPOP AXADD AX,BXcmp ax,0jne yjw1lea dx,ghhmov ah,9int 21hjmp qq1yjw1: JMP B1A2: MOV DL,WW ;显示'-'MOV AH,2INT 21Hmov cx,65535mai1: loop mai1CALL RAND1CALL MCATMOV DL,GGMOV AH,2INT 21HPOP AXSbb AX,BXcmp ax,0jne yjw2lea dx,ghhmov ah,9int 21hjmp qq1yjw2: JMP B1B1: MOV BX,AXCALL MCATlea DX,IIMOV AH,9INT 21HQQ1: MOV AH,4CHINT 21HMCAT PROC ;将随机数转换为16进制表示的ASCII码字符子程序 PUSH AXpush bxPUSH CXPUSH DXCMP BX,9JA S1PUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb1mov www,1jmp vn1vb1:mov www,0vn1:pop dxpop cxpop bxpop axADD BL,30HMOV AA,BLMOV AA+1,'$'LEA DX,AAMOV AH,9INT 21HJMP s3s1:MOV CL,4MOV AL,0PUSH BXSHL BX,CLCMP BH,9JBE V1SUB BH,9ADD BH,40HJMP MM1V1:ADD BH,30HMM1:MOV AA,BHPOP BXAND BL,0FHPUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb2mov www,1jmp vn2vb2:mov www,0vn2:pop dxpop cxpop bxpop axCMP BL,9JBE TT1SUB BL,9ADD BL,40HJMP RR1TT1: ADD BL,30HRR1: MOV AA+1,BLMOV AA+2,'$'LEA DX,AAMOV AH,9INT 21Hs3:POP DXPOP CXPOP BXPOP AXRETMCAT ENDPRAND PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0 ;读时钟计数器值 INT 1AHMOV AX,DX ;清高6位AND AH,3MOV DL,101 ;除101,产生0~100余数 DIV DLMOV BL,AH ;余数存BX,作随机数POP AXPOP DXPOP CXRETRAND ENDPRAND1 PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0INT 1AHMOV ax,cxAND AH,3MOV DL,101DIV DLMOV BL,AHPOP AXPOP DXPOP CXRETRAND1 ENDPCODE ENDSEND START案例3计算平台长度程序data segmentobf db '***** welcome you !*****',0dh,0ahdb ' input data:','$'a0 db ?a1 db ?b0 db ?b1 db ?a db ?b db ?data endsstack segment stackdb 200 dup(0)stack endscode segmentassume cs:code, ds:data,ss:stack main:mov ax, datamov ds, axmov ah, 9lea dx, [obf]int 21hinc dxmov dl, 13mov ah, 2int 21hmov dl,10int 21hmov ah,1int 21hcmp al, 13jz lab1mov [a0], almov [a], almov [a1], 1x1: mov ah, 1int 21hcmp al, 13jz lab1mov [b], almov bl, [b]cmp bl, [a]jnz x2add [a1], 1jmp x1x2: mov [b0], blmov [b1], 1x3: mov ah, 1int 21hmov [a], alcmp bl,[a]jnz x4add [b1],1jmp x3x4: mov cl, [b1]cmp cl, [a1]jb y1mov cl, [b0]mov [a0], clmov cl, [b1]mov [a1],cly1: cmp al, 13jz lab1mov [b0], al mov [b1], 1mov [b], almov bl, [b]jmp x3lab1: mov ah, 2mov dl,13int 21hmov dl,10int 21hcmp [a1],10 jb z1mov ah,0mov al, [a1] mov bl, 10div bladd ax, 3030h mov bx, axmov ah, 2mov dl, blint 21hmov dl, bhint 21hjmp z2z1: add [a1], 30h mov dl, [a1]int 21hsub [a1],30hz2: mov ah,2mov dl, 13int 21hmov dl, 10int 21hmov cx, 0mov cl, [a1]mov ah, 2m: mov dl,[a0]int 21hloop mmov ah, 4chint 21hcode endsend main案例4加减乘除四则运算B_P EQU BYTE PTRW_P EQU WORD PTRD_P EQU DWORD PTR CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H;主程序开始NEWSTAR:JMP STAREVENNUM1 DW 0,0NUM2 DW 0,0NUM3 DW 0,0JGV4 DW 0,0YSF LABEL WORDYSF1 DB 0YSF2 DB 0JUV DB 0UV DB 0;使DS:SI指向第一有效字符OVERS LABEL NEARCLDPUSH AXOVERS1:LODSBCMP AL,' 'JZ OVERS1CMP AL,9JZ OVERS1DEC SICMP AL,13POP AXRET;输出一个制表符TAB LABEL NEARMOV AL,9JMP SHORT DISP ;输出一个回车换行符CRLF LABEL NEARMOV AL,13CALL DISP;显示一个字符DISP LABEL NEAR PUSH AXPUSH DXMOV AH,2 MOV DL,AL INT 21HPOP DXPOP AXRET;检查是否为运算符ISYSF LABEL NEAR CLDLODSBCALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SI ISYSF1:RET;检查是否是加减运算ISJJ LABEL NEAR CMP AL,'+' JZ ISYSF1 CMP AL,'-' RET;检查是否为乘除运算ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'\' RET;数据输出;CX=10 十进制;CX=16 十六进制DOUT LABEL NEAR PUSH AXPUSH BXPUSH DXPUSH BPDOUT1:INC BPPUSH AXMOV AX,DXXOR DX,DXDIV CXMOV BX,AXPOP AXDIV CXPUSH DXMOV DX,BXOR BX,AXJNZ DOUT1DOUT2:POP AXADD AL,'0'CMP AL,'9'JBE DOUT3ADD AL,'A'-'9'-1 DOUT3:CALL DISPDEC BPJNZ DOUT2POP BPPOP DXPOP BXPOP AXRET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEARPUSH BXPUSH BPPUSH DIXOR AX,AXXOR DX,DXDATE1:MOV DI,AXLODSBCMP AL,'0'JB DATE7CMP AL,'9'DATE2:AND AX,0FHSHL DI,1RCL DX,1MOV BX,DIMOV BP,DXSHL DI,1RCL DX,1SHL DI,1RCL DX,1JCXZ DATE3SHL DI,1RCL DX,1Jmp short DATE4DATE3:ADD DI,BXADC DX,BPDATE4:ADD AX,DIADC DX,0JMP DATE1DATE5:ADD AL,9JMP DATE2DATE6:JCXZ DATE7CMP AL,'A'JB DATE7CMP AL,'F'JBE DATE5CMP AL,'a'JB DATE7CMP AL,'f'JBE DATE5DATE7:MOV AX,DIDEC SIOR DI,DXPOP DIPOP BPPOP BXRET;数据1与数据2根据YSF1进行加减运算MOV AX,NUM2MOV DX,NUM2+2CMP YSF1,'+'JZ JSJJ1SUB NUM1,AXSBB NUM1+2,DXJMP SHORT JSJJ2JSJJ1:ADD NUM1,AXADC NUM1+2,DXJSJJ2:RET;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEARMOV BX,OFFSET NUM1JMP SHORT JSII2_1;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEARMOV BX,OFFSET NUM2JSII2_1:DB 66HMOV AX,[BX]DB 66HMOV CX,[BX+4]CMP YSF2,'*'JNZ JSII2_2DB 66HIMUL CXJMP SHORT JSII2_3JSII2_2:DB 66HCWDDB 66HIDIV CXCMP YSF2,'/'JZ JSII2_3DB 66HXCHG DX,AXJSII2_3:DB 66HMOV [BX],AXRET;显示结果MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10CMP UV,10JZ XUJG0MOV CX,16 XUJG0:TEST DX,8000H JZ XUJG1CMP UV,10JZ XUJG2CALL DOUT XUJG2:NOT AXNOT DXADD AX,1ADC DX,0PUSH AXCMP UV,10JZ XUJG3MOV AL,' 'CALL DISPMOV AL,'('CALL DISP XUJG3:MOV AL,'-'CALL DISPPOP AXCMP UV,10JZ XUJG1CALL DOUTMOV AL,')'CALL DISPRETXUJG1:CALL DOUTRET;计算结果放入DX:AX中JSJG LABEL NEARCALL JSJJMOV AX,NUM1 MOV DX,NUM1+2 RET;从DS:SI处取一个数据LOADATE LABEL NEARLODSBCMP AL,'('JZ LOADATE1DEC SIPUSH CXXOR CX,CXCMP UV,10JZ LOADATE0INC CX ;取16进制数LOADATE0:CALL DATE ;取数据放入DX:AX中POP CXRETLOADATE1:PUSH NUM1 ;保存数据1数据2及运算符 PUSH NUM1+2PUSH NUM2PUSH NUM2+2PUSH YSFINC JUVMOV JGV4,0 ;结果值清零MOV JGV4+2,0;进行四则运算SZYS LABEL NEARCALL ISYSF ;首字符是运算符?JZ SZYS2CALL LOADATE ;不是,取数并保存MOV NUM1,AXMOV NUM1+2,DXSZYS1:XOR AX,AX ;数据2清零MOV NUM2,AXMOV NUM2+2,AXCALL ISYSF ;下个是运算符?JZ SZYS3JNZ SZYS6SZYS2:PUSH AXMOV AX,JGV4 ;将结果作为数据1MOV NUM1,AXMOV AX,JGV4+2MOV NUM1+2,AXPOP AXSZYS3:MOV YSF1,ALMOV YSF2,ALCALL ISJJ ;是加减运算转JZ SZYS4CALL LOADATE ;取数据2MOV NUM2,AXMOV NUM2+2,DXCALL JSII1 ;数据1与数据2根据YSF1进行乘除运算 JMP SZYS1 ; 结果保存在数据1中SZYS4:CALL LOADATE ;取数据2并保存MOV NUM2,AXMOV NUM2+2,DXSZYS4_1:CALL ISYSFJNZ SZYS6CALL ISJJ ;运算符2是加减运算?JNZ SZYS5 ;不是转PUSH AXCALL JSJJ ;数据1与数据2根据YSF1进行加减运算 POP AX ; 结果保存在数据1中MOV YSF1,AL ;保存新的运算符JMP SZYS4SZYS5:MOV YSF2,AL ;保存运算符2CALL LOADATE ;取数据3MOV NUM3,AXMOV NUM3+2,DXCALL JSII2 ;数据2与数据3根据YSF2进行乘除运算 JMP SZYS4_1 ; 结果保存在数据2中SZYS6:MOV CL,ALCMP AL,13JNZ SZYS9SZYS7:CALL JSJGCMP JUV,0JZ SZYS8DEC JUVPOP YSFPOP NUM2+2POP NUM2POP NUM1RETSZYS8:CMP CL,')'JZ SZYS10MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12 SZYS9:CMP AL,')'JNZ SZYS11INC SIJMP SZYS7 SZYS10:MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1 SZYS11:STCRETSZYS12:CLCRET;数制处理UVIL LABEL NEARPUSH SIUVIL1:LODSBCMP AL,' 'JZ UVIL2CMP AL,9JZ UVIL2CMP AL,13JZ UVIL4JNZ UVIL1 UVIL2:MOV BX,SICALL OVERSJZ UVIL3LODSWCALL OVERSPOP SIJNZ SZYS11JNZ SZYS11PUSH SIMOV UV,10UVIL3:MOV AL,13MOV [BX-1],AL UVIL4:POP SICLCRET;预置结果YVJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2] MOV DS,AXMOV AX,DS:[0CH] MOV CS:JGV4,AX MOV AX,DS:[0EH] MOV CS:JGV4+2,AX PUSH CSPOP DSPUSH CSPOP ESRET;保存结果BCJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2] MOV DS,AXMOV AX,CS:JGV4 MOV DS:[0CH],AX MOV AX,CS:JGV4+2 MOV DS:[0EH],AX PUSH CSPOP DSPUSH CSPOP ESRETSTAR:MOV SI,81HCLDJNZ STAR1STAR0:MOV DX,OFFSET MESS1JMP STAR4STAR1:CALL YVJGCALL UVILJB STAR0MOV SAVESP,SPCALL SZYSMOV SP,SAVESPMOV DX,OFFSET MESS2JB STAR4CALL CRLFCALL XUJGCALL BCJGMOV DX,OFFSET MESS3STAR4:MOV AH,9INT 21HINT 20HSAVESP DW 0MESS1 DB 13,10,' Syntax:',13,10DB ' JS <Expression> [10]',13,10,'$'MESS2 DB 'Error in expression !$'MESS3 DB 13,10,'$'CODE ENDSEND NEWSTAR案例5数字方阵程序data segmentbuf1 db '1 2 38 9 47 6 5'buf2 db '1 2 3 412 13 14 511 16 15 610 9 8 7'buf3 db '1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9' dbuf db 14 dup(?)i1 db 0dh,0ah,'this is a fangzhen programme'db 0dh,0ah,'input q to exit'db 0dh,0ah,'Please input a number(3--5):','$'i2 db 0dh,0ah,'input error,please reinput!','$'n db ?b db 1data endsstack segmentdb 100 dup(?)stack endscode segmentassume ds:data,cs:code,ss:stack main:mov ax,datamov ds,axcall clearlop: lea dx,i1mov ah,9int 21hmov ah,1int 21hcmp al,'q'jz quitlea si,buf1mov n,7mov cl,3call clearcmp al,'3'jz slea si,buf2mov n,10mov cl,4cmp al,'4'jz slea si,buf3mov cl,5mov n,13cmp al,'5'jz slea dx,i2mov ah,9int 21hcall clearjmp lops:mov bl,nlea di,dbufl: mov al,[si]mov [di],alinc siinc didec bljne lmov [di],byte ptr '$' mov ah,2mov dh,bmov dl,0int 10hlea dx,dbufmov ah,9int 21hinc bloop sjmp lopquit: mov ah,4chint 21h;***清屏***clear proc nearpush axpush bxpush cxpush dxmov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79mov bh,7int 10hpop dxpop cxpop bxpop axretclear endpcode endsend main案例6数据加密程序p macro buflea dx,bufmov ah,9int 21hendmdata segmentpp db 0dh,0ah,' welcome you to run this programme!$' qq db 0dh,0ah,' when you input number,press enter.$' qw db 0dh,0ah,'6eh,52h,94h,52h,$'qa db 0dh,0ah,' $'info1 db 0dh,0ah,0dh,' input number:$'info2 db 0dh,0ah,' output number:$'bufa db 20db ?db 20 dup(0)bufb db 20 dup(0)buf1 db 20db ?db 20 dup(0)buf2 db 20 dup(0)buf3 db 20db ?db 20 dup(0)buf4 db 20 dup(0)data endsstack segmentdb 100 dup(0)stack endscode segmentassume ds:data,cs:codes: mov ax,datamov ds,axmov ah,0mov al,3int 10hmov ah,0bhmov bh,0mov bl,3int 10hp ppp qqlea si,qwmov di,5mov dx,0405hmov ah,15int 10hlp: mov ah,2inc dlint 10hmov bl,[si]mov cx,1mov ah,9int 10hinc sijnz lpp qap qap qap info1lea dx,bufamov ah,10int 21hlea si,bufa+1mov ch,0mov cl,[si]lea di,bufbn: mov bx,offset bufamov al,0xlat bufamov [di],alinc diloop nmov byte ptr [di],'$' p info2p bufbp info1lea dx,buf1mov ah,10int 21hlea si,buf1+1mov ch,0mov cl,[si]lea di,buf2n1: mov bx,offset buf1 mov al,2xlat buf1mov [di],alinc diloop n1mov byte ptr [di],'$' p info2p buf2p info1lea dx,buf3mov ah,10int 21hlea si,buf3+1mov ch,0mov cl,[si]lea di,buf4n2: mov bx,offset buf3mov al,3xlat buf3mov [di],alinc diloop n2mov byte ptr [di],'$'p info2p buf4mov ah,4chint 21hcode endsend s案例7代码转换程序(1)public info1,info2,bufa,bufb,buf,main,info0,info3extrn change1:far,change2:far,change3:far,change4:fardata segmentinfo0 db 0ah,0dh,'this is the change of letter to leter:$'info1 db 0ah,0dh,'please input string:$'info2 db 0ah,0dh,'output string:$'bufa db 81db ?db 80 dup (?)bufb db 80 dup (?)info3 db 0ah,0dh,'this is the change of digital to digital:',0ah,0dh,'$'buf db 0dh,0ah,'the number is:0100101010001111b',0ah,0dh,'the result is:$' data endsstack segment stackdb 200 dup (?)stack endscode segmentmain proc farassume ds:data,cs:code,ss:stackmov ax,datamov ds,axdisp macro mlea dx,mmov ah,9int 21hendmcall change1call change2disp info3disp bufcall change3call change4retmain endpcode endsend(2)extrn info1:byte,info2:byte,bufa:byte,bufb:byte,info0:byte public change1code segmentassume cs:codelowtohigh proc nearcmp al,'a'jb stopcmp al,'z'ja stopsub al,20hstop :retlowtohigh endpchange1 proc farlea dx,info0mov ah,9int 21hlea dx,info1mov ah,9int 21hlea dx,bufamov ah,10int 21hlea si,bufa+1lea di,bufbmov ch,0mov cl,[si]add si,1next:mov al,[si]call lowtohighmov [di],alinc siinc diloop nextmov byte ptr [di],'$'lea dx,info2mov ah,9int 21hlea dx,bufbmov ah,9int 21hretchange1 endpcode endsend(3)extrn info1:byte,info2:byte,bufa:byte,bufb:byte public change2code segmentassume cs:codehightolow proc nearcmp al,'A'jb stopcmp al,'Z'ja stopadd al,20hstop:rethightolow endpchange2 proc farlea dx,info1mov ah,9int 21hlea dx,bufamov ah,10int 21hlea si,bufa+1lea di,bufbmov ch,0mov cl,[si]inc sinext:mov al,[si]call hightolowmov [di],alinc siinc diloop nextmov byte ptr [di] ,'$' lea dx,info2mov ah,9int 21hlea dx,bufbmov ah,9int 21hretchange2 endpcode endsend(4)extrn buf:byte,info3:byte public change3code segmentchange3 proc farassume cs:codesub ax,axmov ch,4mov cl,4mov bx,4a8fhrotate: rol bx,clmov al,bland al,0fhadd al,30hcmp al,3ahjl printitadd al,7hprintit: mov dl,almov ah,2int 21hdec chmov dl,'H'mov ah,2int 21hretchange3 endpcode endsend(5)public change4data segmentbuf db 0ah,0dh,'please input the four hexnumber:$' data endscode segmentassume cs:code,ds:datachange4 proc farmov ax,datamov ds,axlea dx,bufmov ah,9int 21hmov bx,0mov ch,4input: mov cl,4sal bx,clmov ah,1int 21hcmp al,39hja afand al,0fhjmp binaryaf: and al,0fhadd al,9binary: or bl,aldec chcmp ch,0jne inputmov dl,'H'mov ah,2int 21hmov dl,0ahmov ah,2int 21hmov ah,02int 21hmov cx,16disp: mov dl,0rol bx,1rcl dl,1or dl,30hmov ah,02hint 21hloop dispmov dl,'B'mov ah,2int 21hretchange4 endpcode endsend(6)public change5data segmentbinary dw 7fffh,50hn=($-binary)/2buf db 7 dup(0)info1 db 0ah,0dh,'this is the change from hexnumber to decimal:$' info2 db 0ah,0dh,'the number is:7fffh,50h$',0ah,0dhinfo3 db 0ah,0dh,'the result is:$'data endsstack segment stackdb 200 dup(0)stack endscode segmentassume cs:code,ds:data,ss:stackf2to10 proc nearpush bxpush dxpush sipush cxdisp macro mlea dx,mmov ah,9int 21hendmlea si,bufor ax,axjns plusneg axmov [si],byte ptr '-' inc siplus: mov bx,10mov cx,0lop1: mov dx,0div bxpush dxinc cxor ax,axjne lop1lop2: pop axcmp al,10jb l1add al,7l1: add al,30hmov [si],alinc sidec cxjne lop2mov [si],byte ptr 'D' inc simov [si],byte ptr '$' disp info3disp bufpop cxpop sipop dxpop bxretf2to10 endpchange5 proc farstart: mov ax,datamov ds,axdisp info1disp info2mov cx,nlea di,binarylopa: mov ax,[di]call f2to10add di,2loop loparetchange5 endpcode endsend案例8键盘录入数据的转换与显示(1)PUBLIC ASC_TO_BIN , BIN_TO_ASCIIDATA SEGMENT COMMONINPUT_MESSAGE DB 0AH , 'PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'IN_ASC_BUF DB 6 ;十进制数的输入缓冲区,共可接收6个字符DB ? ;保留,用于10号调用时DOS填入实际输入字符个数DB 6 DUP(?) ;一个符号位,四位数字ASCII 码,加上一个回车符,;共计6字符BIN_BUF1 DW ? ;将第一个数转换为二进制后,放于此处OUTPUT_MESSAGE DB 0AH , 'THE SUM IS:' , '$'OUT_ASC_SUM DB 6 DUP(?) , '$' ;将二个数的和转换为ASCII码后,放于此处,;以供9号调用显示DATA ENDSCSEG SEGMENTASSUME CS:CSEG , DS:DATAASC_TO_BIN PROC FAR;ASCII码转换为二进制数;入口:十进制数的ASCII码在IN_ASC_BUF内;出口:转换后的二进制数在AX内;算法:先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二;进制数,再由符号位决定是否需要求补。

汇编语言程序设计 实例详解

汇编语言程序设计 实例详解

_c_int00: start:
Done:
.text B NOP NOP SSBX STM STM RPT MVPD STM STM STM RPTZ MAC STH B .end
start
FRCT #0,SWWSR #x,AR1 #7 table,*AR1+ #x,AR2 #a,AR3 #y,AR4 A,#3 *AR2+,*AR3+,A A,*AR4 done
DARAM2: origin = 0200h,length = 100h
}
SECTIONS
{
.data :> RAM
PAGE 0
.text :> RAM
PAGE 0
PROM :> RAM1 PAGE 0
.bss :> DARAM1 PAGE 1
DATA :> DARAM2 PAGE 1
}
[例7-4]使用C54汇编语言编程计算z1=x1+y1、z2=x1-y1,z3=x1* Z4=x2*y2,观察计算结果。其中,x1=20,y1=54,x2=0.5,y2=-0.5
.bss a,20
.bss x,20
DATA
.bss y,20 .usect “DATA”,20
.text
_c_int00: B start
NOP
NOP
start: STM #a,AR1
;a[20]={0,1,2,3,4,5,6,7,8,9,10,
;11,12,13,14,15,16,17,18,19}
.text
_c_int00: B
start
NOP
start:
LD
#x1,DP

汇编语言程序设计示例

汇编语言程序设计示例

汇编语言程序设计示例汇编语言是一种底层的计算机指令语言,常用于编写操作系统、嵌入式系统以及对计算机硬件进行精细控制的程序。

本文将为您提供一些汇编语言程序设计的示例,帮助您更好地理解和应用汇编语言。

示例一:计算两个整数的和```section .datanum1 db 5 ; 定义第一个整数为5num2 db 7 ; 定义第二个整数为7result db 0 ; 定义结果变量为0section .textglobal _start_start:mov al, [num1] ; 将第一个整数加载到寄存器ALadd al, [num2] ; 将第二个整数与AL相加mov [result], al ; 将结果存储到result变量; 显示结果mov eax, 4 ; 系统调用号为4,用于写mov ebx, 1 ; 标准输出文件描述符为1mov ecx, result ; 要写的字符串地址mov edx, 1 ; 要写的字符数量int 0x80 ; 进行系统调用mov eax, 1 ; 退出系统调用号为1,用于退出 xor ebx, ebx ; 返回值为0int 0x80 ; 进行系统调用```示例二:求解斐波那契数列```section .datan db 10 ; 求解第10个斐波那契数列的值 result db 0 ; 定义结果变量为0section .textglobal _start_start:mov ecx, 2 ; 定义计数器ecx,初始值为2 mov al, 0 ; 定义第一个斐波那契数为0mov bl, 1 ; 定义第二个斐波那契数为1fib_loop:add al, bl ; 将前两个数相加xchg al, bl ; 将al和bl的值互换,bl保存下一个斐波那契数 inc ecx ; 计数器加1cmp cl, [n] ; 比较计数器的值与n的值jg fib_end ; 如果计数器大于n,跳转到结束标签jmp fib_loop ; 跳转回循环开始处fib_end:mov [result], bl ; 将结果存储到result变量; 显示结果mov eax, 4 ; 系统调用号为4,用于写mov ebx, 1 ; 标准输出文件描述符为1mov ecx, result ; 要写的字符串地址mov edx, 1 ; 要写的字符数量int 0x80 ; 进行系统调用mov eax, 1 ; 退出系统调用号为1,用于退出xor ebx, ebx ; 返回值为0int 0x80 ; 进行系统调用```这些示例程序涉及了汇编语言的基本操作和语法,但并不包括全部内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档