汇编程序设计实例
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,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
汇编编程实例
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 ; 进行系统调用```这些示例程序涉及了汇编语言的基本操作和语法,但并不包括全部内容。
第4章汇编语言程序设计3(常见程序设计举例)精品PPT课件
;实际字符数送CL ;第一个字符送AL ;暂存在CH
;第一个字符是负
;不是,转NEXT1 ;字符数减1
;指向第一个数字字符 ;清零AX,存二进制数
;若(CL)=0,转NEXT2 ;取字符 ;转换成BCD码 ;加到中间结果上
10
NEXT2:
NEXT3: CHANGE ; CODE
MOV MUL INC JMP MOV AND ADD CMP JNZ NEG MOV RET ENDP
ENDS END
DX,10 DX BX SHORT LP1 DL,[BX] DL,0FH AX,DX CH,’-’ NEXT3 AX [DI],AX
START
;*10 ;指向下一个字符
;取个位数 ;个位ASCII→未组合BCD ;加个位数,(AX)=001AH
;是’-’? ;该数非负,转NEXT3 ;若为负,求补 ;存二进制结果
16
AGAIN1: NEXT1: AGAIN2: NEXT2:
;计算百位的个数 MOV DL,0 SUB AX,1000 JC NEXT1 INC DL JMP AGAIN1 ADD AX,1000 MOV [BX],DL ;计算百位的个数 MOV DL,0 SUB AX,100 JC NEXT2 INC DL JMP AGAIN2 ADD AX,100 MOV [BX+1],DL
;(SP)=0052H ;(AX)=25AFH ;(DI)=0002H STRING-4;(DI)=0005H ;(DX)=25AFH
BCD→二进制数在本例中采用用以下方法:
((((0+千位数)*10+百位数)*10)+十位数)*10+个位数
第一次中间结果
第4章 8086汇编语言程序设计(实例)_6h
4.7 DOS功能调用与子程序设计
子程序/系统功能调用包括入口参数,出口参数 功能号和中断调用指令。
入口参数:传递的数据(有些不需要) 出口参数:返回的数据(有些子程序没有) 功能号: 子程序编号(必须送入AH寄存器) 中断调用:中断调用(INT 21H)
33
4.7 DOS功能调用与子程序设计
……
3
DATA SEGMENT
ARRAY DW 100 DUP(?)
DATA STK
ENDS SEGMENT
PARA
等效于:LEA BX, ARRAY STA区C这K别两‘在S条T于A语C:K句’O不F可FS少ET,是否伪则指,令D,S而
DB 10 DUP(?) STK ENDS
L未EA初是始指化令。性指令,执行阶段不同
;低于,则为大写字母
;高于,则不是字母 ;将小写字母改为大写
MOV [BX] , AL
NEXT: INC BX
JMP A1
EXIT: ……
10
四、表格处理问题
简单加密问题:编程将0~9的数字明码转换为密 码,密码表(明码和密码的映射关系)如下:
0123456789 2716908345
比如,数字1587,加密后成为7043 对此类问题,无法通过确定的函数关系来描述,
;存放结果(密码)
ENDS
……
程序需要做什么样的修改呢?
DATA TAB VA1 VA2 DATA
SEGMENT
DW 2, 7, 1, 6 ,9, 0, 8, 3, 4, 5 ;密码表
DB 8, 4, 1, 7, 5
;被加密码(明码)
DB 5 DUP(?)
;存放结果(密码)
ENDS
汇编语言典型例子详解经典汇编程序案例
汇编语言典型例子详解经典汇编程序案例汇编语言是一种低级程序设计语言,它直接操作计算机的硬件资源,为计算机执行指令提供了底层的支持。
在计算机发展的早期阶段,汇编语言是主要的编程语言之一,它的应用广泛而重要。
本文将详细解析汇编语言的典型例子,并结合经典的汇编程序案例进行详细讲解。
1. 汇编语言的介绍汇编语言是一种接近机器指令的低级语言,它使用助记符将机器语言表示成易于理解和编写的形式。
与高级语言相比,汇编语言更加底层,可以直接操作计算机的寄存器、内存等硬件资源。
汇编语言的执行速度快,对硬件资源的控制更为精确,因此在一些对性能要求较高的应用中仍然得到广泛应用。
2. 经典汇编程序案例:斐波那契数列斐波那契数列是一个经典的数学问题,定义如下:第一个数为0,第二个数为1,从第三个数开始,每个数都等于前两个数之和。
用数学公式表示就是:Fn = Fn-1 + Fn-2。
现在我们将通过汇编语言来实现斐波那契数列的计算。
首先,我们需要定义一段连续的内存空间用来存储计算结果。
假设我们使用存储器的地址0x1000开始的连续10个字节的空间来保存斐波那契数列的前10个数字。
我们可以使用寄存器来保存地址0x1000,并使用另一个寄存器来保存计算结果。
下面是具体的汇编代码:```MOV AX, 0x1000 ; 将地址0x1000存入寄存器AXMOV BX, 0 ; 初始化计数器BX为0MOV CX, 1 ; 初始化计数器CX为1MOV DX, 0 ; 初始化计算结果DX为0LOOP_START:MOV [AX+BX], DX ; 将计算结果存入内存空间ADD DX, CX ; 计算下一个数XCHG DX, CX ; 交换计算结果和前一个数INC BX ; 计数器加1CMP BX, 10 ; 判断是否计算完成JL LOOP_START ; 如果计数器小于10,继续循环```以上是一个简单的汇编程序实例,通过循环计算并保存斐波那契数列的前10个数字。
汇编语言程序设计实例分析
MOV AL,TAB MOV BX,OFFSET TAB MOV CL,9 LL: INC BX CMP AL,[BX] JAE TT XCHG AL,[BX] TT: DEC CL JNZ LL MOV MAX,AL MOV AH,4CH INT 21H CODE ENDS END START
例3:设计一个程序,统计内存W单元保 存的无符号字数据中有多少个二进制 “1”,结果送内存N单元保存
分析:要统计内存W单元保存的无符号字数 据中有多少个二进制“1”,可将该数据送至 寄存器AX中,通过移位指令将AX中的每一 位依次移入进位位CF中,若CF=1则计数器 CL的值加1。 这样就可以统计出址加1 ;两数比较 ;大于等于转 ;交换数据位置 ;计数器减1 ;非0转 ;保存最大数
例7:从键盘输入3-9之间的数字,用 “*”号组成三角形图案
例如:输入数字7,屏幕上显示出以下图案: ******* ****** ***** **** *** ** * 可采用双重循环程序,外循环控制行数,内循环 控制列数。
CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H CMP AL,33H JB START CMP AL,39H JA START SUB AL,30H MOV CL,AL MOV CH,0 MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH INT 21H
思考:在本例的基础上,若要在屏幕上 显示出以下图案,应该如何设计程序?
* ** *** **** ***** ****** ******* ********* 或者: * * *
*
* * ************
汇编语言程序设计例子
汇编语言程序设计例子汇编语言程序设计典型案例一顺序程序设计例:从键盘输入两个数字(0-9)输出它们积。
(X1 已验证) P41CODE SEGMENTASSUME CS:CODEORG 100HMain:MOV AH,1INT 21HMOV BL,ALMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV AH,1INT 21HSUB AL,30HSUB BL,30HMUL BLMOV BL,10DIV BLADD AX,3030HMOV BX,AXMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,BLMOV AH,2INT 21HMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,BHMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND Main二分支程序1 简单分支例:已知AX中放有一个16位无符号数,BL中放有一个8位无符号数,1P50编写将它们相加结果放DX的程序。
2 两路分支例:编写将BX与DX中较大的一个无符号数放入AX中的程序。
( X2 已验证) 1P51DATA SEGMENTBUF1 DW ?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA SI,BUF1MOV BX,[SI]INC SIMOV DX,[SI]CMP BX,DXJA Lab1MOV AX,DXJMP Lab2Lab1:MOV AX,BXLab2:MOV AH,4CHINT 21HCODE ENDSEND START3 复杂条件的分支例子:从键盘读入两个一位数,并输出其积。
P52(X1 已验证)CODE SEGMENTASSUME CS:CODEORG 100HMOV AH,1;从键盘读第一个数INT 21HCMP AL,'0'JB Lab1CMP AL,'9'JA Lab1MOV BL,ALMOV AH,2MOV DL,13HINT 21HMOV DL,10HINT 21HMOV AH,1; 从键盘读第二个数INT 21HCMP AL,'0'JB Lab1CMP AL,'9'JA Lab1SUB AL,30H ;把后读入的数的ASCALL码还原为数字SUB BL,30H ;把先读入的数的ASCALL码还原为数字MUL BL ;两数相MOV BL,10 ;DIV BL ;分拆积的十位和个位ADD AX,3030H ;积转换为ASCALL码MOV BX,AXMOV AH,2MOV DL,13H ;回车INT 21HMOV DL,10H ;换行INT 21HMOV DL,BL;输出显示十位MOV AH,2INT 21HMOV DL,BH;输出显示个位INT 21HJMP Lab2Lab1:MOV AH,2MOV DL,'E'INT 21HLab2:MOV AH,4CHINT 21HCODE ENDSEND4 多路分支例3 从键盘上接收按键输入,如果按下的是小写字母则输出‘L’,是大写字母则输出‘U’,如果是数字则输出‘N‘,都不是则输出‘*’。
汇编语言程序设计例子
HFF =2SR H09=1SR �为果结行运则�H09 为义定 1SR 将若
TRATS DNE SDNE EDOC H12 TNI HC4 ,HA VOM :ENOD 0←)2SR( ,0�X 若 ; 0 ,2SR VOM :LUQE ENOD PMJ 1←)2SR( ,0�X 若 ; 1 ,2SR VOM LUQE→0�X 若 ; LUQE EJ :GIB ENOD PMJ HFF0�补]1-[←)2SR( ,0�X 若 ; HFF0 ,2SR VOM GIB→0≥X 若 ; GIB EGJ 较比 0 与 X 将 ; 0 ,LA PMC X←LA ; 1SR ,LA VOM XA ,SD VOM ATAD ,XA VOM :TRATS ATAD :SD ,EDOC :SC EMUSSA TNEMGES EDOC SDNE ATAD BD 2SR BD 1SR 元单储存的值 Y 数函 ; X 量变自放存 ; X
BAT GESD 。下如序程
图程流序程 23.4 例 61.4 图
7
分部改修�3� 。作操体具种各成 完于用 �段序程的行执复重要都环循次每是�分部心核的序程环循是体环循
体环循�2� 。等值始初的量变他其置设 �值始初数计的数次环循置设 �针指立建括包 。作工备准做环循为要主分部这
分部化始初�1�
。下如序程
图程流序程 92.4 例 11.4 图 。示所 11.4 图如程流序程。址 地元单的放存中表在值方平的 x 是便�和的 x 数与址地始起的表知可�„„�元 单 1+ASSR 在放存 21�元单 0+ASSR 在放存 20 即�ASSR 为址地�0 为址首表以所 �的序顺是序次放存的表方平 01�0 为因。律规放存的表到找即�系关的址地在 所果结的查要和址地始起的表到找要是键关 �序程表查类此制编 �路思题解
100个汇编范例
100个汇编范例定点运算和定点数制转换;范例1LSDAA: ADC R16,R16 ;十进制数(在R16中)左移调整子程序ADDAA: IN R6,SREG ;bcd码相加调整子程序,先保存相加后的LDI R17,$66 ;状态the old statusADD R16,R17 ;再将和预加立即数$66IN R17,SREG ;输入相加后新状态(the new status)OR R6,R17 ;新旧状态相或SBRS R6,0 ;相或后进位置位则跳行SUBI R16,$60 ;否则减去$60(十位bcd不满足调整条件) SBRS R6,5 ;半进位置位则跳行SUBI R16,6 ;否则减去$06(个位bcd不满足调整条件)ROR R6 ;向高位字节BCD返还进位位!RET;范例2SUDAA: BRCC SBD1 ;bcd码减法调整子程序,差在R16中BRHC SBD3SUBI R16,$66 ;进位半进位都置位,将差减去立即数$66SEC ;并恢复借位CRET ;ret. with seCSBD1: BRHC SBD2 ;进位半进位都清位,返回SUBI R16,6 ;进位清除而半进位置位,将差减去6SBD2: RET ;ret. with clCSBD3: SUBI R16,$60 ;进位置位而半进位清除,将差减去$60 SEC ;并恢复借位CRET ;ret. with seC;范例3RSDAA: SBRC R16,7 ;bcd码(在R16中)右移调整子程序SUBI R16,$30 ;十位BCD最高位为1(代表8),将其变为5(否则跳行)SBRC R16,3SUBI R16,3 ;个位BCD最高位为1(代表8),将其变为5(否则跳行)RET;范例4ADBCD4: MOV R16,R15 ;4字节压缩bcd码相加子程序ADD R16,R11 ;R12,R13,R14,R15内为被加数,R8,R9,R10,R11内为加数RCALL ADDAA ;相加后调整MOV R15,R16 ;并返还调整后结果MOV R16,R14ADC R16,R10RCALL ADDAAMOV R14,R16MOV R16,R13ADC R16,R9RCALL ADDAAMOV R13,R16MOV R16,R12ADC R16,R8RCALL ADDAAMOV R12,R16RET;范例5ADBCD: LDI R16,4 ;多字节压缩bcd码相加子程序MOV R7,R16 ;(r7):字节数CLCADLOP: LD R16,-X ;X-1指向被加数;LD R6,-Y ;Y-1指向加数ADC R16,R6RCALL ADDAA ;相加后调整ST X,R16 ;返还调整后结果DEC R7BRNE ADLOPRET;范例6SUBCD4: MOV R16,R15 ;4字节压缩bcd码减法子程序SUB R16,R11 ;R12,R13,R14,R15内为被减数,R8,R9,R10,R11内为减数RCALL SUDAA ;相减后调整MOV R15,R16 ;并返还调整后结果MOV R16,R14SBC R16,R10RCALL SUDAAMOV R14,r16MOV R16,R13SBC R16,R9RCALL SUDAAMOV R13,R16MOV R16,R12SBC R16,R8RCALL SUDAAMOV R12,R16RET;范例7SUBCD: LDI R16,4 ;多字节压缩bcd码相减子程序MOV R7,R16 ;(r7):压缩bcd码字节数CLCSUBLP: LD R16,-X ;X-1指向被减数LD R6,-Y ;Y-1指向减数SBC R16,R6RCALL SUDAA ;相减后调整ST X,R16 ;返还调整后结果DEC R7BRNE SUBLPRET;范例8 ;16位被乘数*16位乘数-->32位积MUL16: LDI R16,17 ;(r10r11)*(r14r15)-->r12r13r14r15 ClR R12ClR R13 ;积的高位字预清除CLC ;第1次只右移,不相加MLOOP: BRCC MUL1 ;ADD R13,R11 ;乘数右移移出位为1,将被乘数加入部分积ADC R12,R10MUL1: ROR R12ROR R13ROR R14ROR R15 ;部分积连同乘数整体右移1位DEC R16BRNE MLOOP ;17次右移后结束RET;范例9 ;16位整数被乘数*16位小数乘数-->16位整数积,精确到0.5MUL165: RCALL MUL16 ;先得到32位积SBRS R14,7 ;积小数部分最高位为1,将整数部分加1RET ;否则返回LDI R17,255SUB R13,R17SBC R12,R17 ;以减去-1($FFFF)替代加1RET;范例10 ;32位被除数/16位除数-->16位商,精确到1DIV16: LDI R16,16 ;(r12r13r14r15)/(r10r11)-->r14r15DLOOP: LSL R15ROL R14ROL R13ROL R12 ;被除数左移1位BRCS DI1SUB R13,R11SBC R12,R10 ;移出位为0,被除数高位字减去除数试商BRCC DI2 ;够减,本位商为1ADD R13,R11ADC R12,R10 ;否则恢复被除数RJMP DI3 ;本位商0DI1: SUB R13,R11SBC R12,R10 ;移出位为1,被除数高位字减去除数DI2: INC R15 ;本位商1DI3: DEC R16BRNE DLOOPRET;范例11 ;32位被除数/16位除数-->16位商,精确到0.5;可能产生溢出!例$7FFFC000/$8000=$FFFF.8->$10000!DIV165: RCALL DIV16 ;(r12r13r14r15)/(r10r11)-->r14r15LSL R13ROL R12 ;余数乘2BRCS D165 ;有进位,转5入SUB R13,R11SBC R12,R10 ;否则,余数乘2减去除数BRCS D164 ;不够减,转4舍D165: CLR R13 ;否则将商增1SECADC R15,R13ADC R14,R13ADC R13,R13 ;若有溢出,溢出位在R13中RETD164: CLR R13RET;范例12 ;32位整数/16位整数->16整数+16位小数->4字节浮点数;(r12r13r14r15)/(r10r11)-->r12r13r14r15DIV16F: RCALL DIV16 ;先做整数除法MOV R9,r15MOV R8,r14 ;保存整数部分CLR R15CLR R14RCALL DIV16 ;除得小数部分MOV R11,R15MOV R15,R14MOV R13,R8MOV R14,R9 ;整数部分在r13r14,小数部分在r15r11LDI R17,$90 ;预设阶码$90(整数为16位)MOV R12,R17LDI R17,32 ;设32次右移DIV16L: SBRC R13,7RJMP NMLDN ;最高位为1,已完成规格化LSL R11 ;否则继续右移R13,R14,R15,R11ROL R15ROL R14ROL R13DEC R12 ;阶码减1DEC R17BRNE DIV16LCLR R12 ;右移达32次,浮点数为零,置零阶RETNMLDN: SBRS R11,7RJMP DIVRT ;欲舍去部分(R11)最高位为0,转4舍RCALL INC3 ;否则尾数部分增1BRNE DIVRTINC R12 ;尾数增1后变为0,改为0.5,并将阶码增1DIVRT: LDI R17,$7F ;将尾数最高位清除,表示正数(负数不要清除)AND R13,R17 ;规格化浮点数在R12(阶码)R13R14R15(尾数)中RET;范例13 ;(R16,R12,R13,R14,R15)/(R10,R11)-->R13,R14,R15DIV24: CLR R16 ;32位整数/16位整数->24位整数,要求(R10)不为0;否则;要求(R12)<(R11)DIV40: LDI 17,24 ;40位整数/16位整数->24位整数要求(R16,R12)LXP: LSL R15 ; <(R10,R11)ROL R14ROL R13ROL R12ROL R16BRCC LXP1SUB R12,R11 ;右移后C=1 够减SBC R16,R10 ;被除数减去除数RJMP DIV0 ;本位商为1LXP1: SUB R12,R11 ;C=0SBC R16,R10 ;被除数减去除数试商BRCC DIV0 ;C=0 够减,本位商1ADD R12,R11ADC R16,R10 ;否则恢复被除数,本位商0RJMP DIV1DIV0: INC R15 ;记本位商1DIV1: DEC R17BRNE LXPLSL R12ROL R16BRCS GINC ;C=1,5入SUB R12,R11SBC R16,R10BRCS RET3 ;不够减,舍掉GINC: RCALL INC3 ;将商增1RET3: RET;范例14 ;定点整数(最大$FFFFFFFF)开平方子程序INTSQR: LDI R16,17 ;SQR(R12,R13,R14,R15)-->(r15r8r9)CLR R8 ;R8,R9存储平方根CLR R9 ;r10,r11,r12,r13,r14,r15CLR R10 ; r8, r9(根) r16 (counter)CLR R11 ;r10,r11:被开平方数扩展字节LDI R17,$40SQR0: SUB R12,R17SBC R11,R9SBC R10,R8BRCS SQR1SEC ;试根够减,本位根1RJMP SQR2SQR1: ADD R12,R17ADC R11,R9ADC R10,R8CLC ;否则恢复被开平方数,本位根0SQR2: DEC R16BRNE SQR3 ;when the No.17bit of root be gettingSQR20: ADC R9,R15 ;R15 HAVE BEEN CLEARED!ADC R8,R15ADC R15,R15 ;将开出之根4舍5入,使根最大可达65536(=$10000)!RET ;for example:sqr.($ffff0001)≈$10000SQR3: ROL R9ROL R8 ;记本位根LSL R15ROL R14ROL R13ROL R12ROL R11ROL R10 ;被开平方数连同其扩展字节左移一位LSL R15ROL R14ROL R13ROL R12ROL R11ROL R10 ;被开平方数连同其扩展字节再次左移一位/左移2位开出1位根BRCS SQR20 ;被开平方数左移2位后,若进位置位,则仅表明第17位根;已被提前开出且该位根=1,将平方根增1,开平方结束。
第4章典型汇编程序设计举例
第4章典型汇编程序设计—举例
将 BLOCK 内存区的带符号字节型数据按照正数、负数分开,并分别 存入BUFF1和BUFF2中 LEA BX,BUFF2 DATA SEGMENT MOV CX,60 BLOCK DB 60 DUP(?) CLD BUFF1 DB 60 DUP(?) LOP: LODSB BUFF2 DB 60 DUP(?) TEST AL,80H DATA ENDS JNZ FU CODE SEGMENT STOBS ASSUME CS:CODE,DS:DATA JMP AGAIN START: MOV AX,DATA FU: XCHG BX,DI MOV DS,AX STOSB MOV ES,AX XCHG BX,DI INT 21H LEA SI,BLOCK AGAIN: LOOP LOP CODE ENDS LEA DI,BUFF1 MOV AX,4C00H END START
第4章典型汇编程序设计—举例
表格处理 编写程序实现0—9的数字转换成所要求的密码 0 1 2 3 4 5 6 7 8 9 2 7 1 6 9 0 8 3 4 5 DATA SEGMENT MOV DI,OFFSET VAL2 TABLE DB 2,7,1,6,9,0,8,3,4,5 MOV CX,5 VAL1 DB 8,4,1,7,5 LEA BX,TABLE VAL2 DB 5 DUP(?) A1: MOV AL,[SI] DATA ENDS XLAT CODE SEGMENT MOV [DI],AL ASSUME CS:CODE,DS:DATA INC SI START:MOV AX,DATA INC DI INT 21H MOV DS,AX LOOP A1 CODE ENDS MOV SI,OFFSET VAL1 MOV AX,4C00H END START