汇编打字程序完整代码
汇编语言程序设计:_基本输入输出程序-精
![汇编语言程序设计:_基本输入输出程序-精](https://img.taocdn.com/s3/m/7f87adc158fafab068dc024d.png)
1. 键盘输入程序设计 2. 显示输出程序设计 3. 指令学习 4. 本讲小结 5. 作业
1、键盘输入程序
键盘输入方法
使用DOS功能调用 INT 21h
AH=01
键盘输入并回显
从标准输入设备读取字符,带回显,字符的ASCII码存放在AL.如果键 盘缓冲区没有字符,将等待输入。
如何知道 b = ?
mov ah,1 int 21h mov dl,al int 20h
程序2 (无回显)
mov ah,7 int 21h mov dl,al int 20h
键盘输入示例2
将键盘输入的一个一位数保存在DL寄存器中 程序1
mov ah,1 int 21h sub al,‘0’ ;数字0的ASCII码 30H mov dl,al int 20h
mov ch,al
; 输入的第2个数据存放在ch中
mov dl,cl
add dl,ch
int 20h
键盘输入示例4
接受键盘输入的一个两位正整数,保存在DL寄存器中
思考
两位正整数的输入假设是xy(x为十位数,y为个位数)
使用键盘输入首先接收到的是x,然后是y
在DL中要保存的是使用x和y计算出的数
怎样计算 ?
开始
输入 AL 计算ALALx2
输出AL的值 结束
显示输出示例1(程序调试)
该程序有错误!
跟踪后发现什么?
错误原因
使用DOS功能调用 INT 21h AH=2 将字符输出到标准输出设备,显示字符的ASCII码存放在DL中。 显示后 AL = DL
程序2
MOV AH,1 INT 21H SUB AL,30H ADD AL,AL MOV CL,AL ;保存在cl中 MOV DL,'<' MOV AH,2 INT 21H MOV DL,CL ;从cl中取出数据 ADD DL,30H MOV AH,2 INT 21H MOV DL,'>' MOV AH,2 INT 21H INT 20H
《汇编语言功能号》
![《汇编语言功能号》](https://img.taocdn.com/s3/m/3de8d14af7ec4afe04a1df36.png)
失败:AX=错误码
4CH
程序终止
AL=返回码
4DH
取返回码
AL=返回码
4EH
查找第一个目录项
DS:DX=ASCII串地址,CX=属性
AX=错误码
4FH
查找下一个目录项
DS:DX=ASCII串地址
AX=错误码
54H
读取磁盘写标志
AL=当前标志值
56H
文件改名
DS:DX=旧ASCII串,
19H
取当前磁盘
AL=当前驱动器号
1AH
设置DTA地址
DS:DX=ቤተ መጻሕፍቲ ባይዱTA地址
1BH
取缺省驱动器FAT信息
AL=每簇的扇区数,
DS:BX=FAT标识字节
CX=物理扇区的大小,
DX=驱动器和簇数
21H
随机读
DS:DX=FCB首地址
AL=00H读成功
AL=01H文件结束
AL=02H缓冲区溢出
AL=03H缓冲区不满
DS:DX=FCB首地址
AL=00H文件找到,AL=FFH未找到
13H
删除文件
DS:DX=FCB首地址
AL=00H删除成功,AL=FFH未找到
14H
顺序读
DS:DX=FCB首地址
AL=00H读成功
AL=01H文件结束,记录无数据
AL=02H DTA空间不够
AL=03H文件结束,记录不完整
15H
顺序写
48H
分配内存空间
BX=申请内存容量
成功:AX=分配内存首址
失败:BX=最大可用空间
49H
释放内存空间
ES=内存起始段地址
汇编语言程序代码
![汇编语言程序代码](https://img.taocdn.com/s3/m/70deece3b1717fd5360cba1aa8114431b90d8e32.png)
汇编语言程序代码尽管现代编程语言如Java、Python等变得越来越流行,但汇编语言仍然是计算机科学领域中重要的一部分。
汇编语言是一种低级语言,它直接与计算机的硬件交互。
本文将介绍一些常见的汇编语言程序代码示例,帮助读者更好地理解和应用汇编语言。
1. 汇编语言入门汇编语言是一种基于机器指令的编程语言,它将符号标签与机器指令一一对应。
下面是一个简单的汇编语言程序示例:```assemblysection .datamessage db "Hello, World!", 0section .textglobal _start_start:; write the message to standard outputmov eax, 4 ; system call number for writemov ebx, 1 ; file descriptor for standard outputmov ecx, message ; pointer to the messagemov edx, 13 ; message lengthint 0x80 ; trigger the system call; exit the programmov eax, 1 ; system call number for exitxor ebx, ebx ; exit code 0int 0x80 ; trigger the system call```以上汇编代码实现了在屏幕上输出"Hello, World!"的功能。
它使用了Linux内核的系统调用接口来完成输入输出操作。
2. 汇编语言的数据处理汇编语言可以直接对计算机的寄存器和内存进行操作,因此具有较高的灵活性和效率。
下面是一个将两个数字相加并输出结果的示例:```assemblysection .datanum1 dd 42num2 dd 23result dd 0section .textglobal _start_start:; load the values of num1 and num2 into registers mov eax, [num1]mov ebx, [num2]; add the valuesadd eax, ebx; store the result into memorymov [result], eax; convert the result to string for printingmov ebx, resultmov ecx, 10xor edx, edxdiv ecxadd edx, '0'mov byte [ebx+4], dlmov ax, dxxor edx, edxdiv ecxadd edx, '0'mov byte [ebx+3], dlmov ax, dxxor edx, edxdiv ecxadd edx, '0'mov byte [ebx+2], dlmov ax, dxxor edx, edxdiv ecxadd edx, '0'mov byte [ebx+1], dlmov ax, dxadd al, '0'mov byte [ebx], al; write the result to standard output mov eax, 4mov ebx, 1mov ecx, resultmov edx, 5int 0x80; exit the programmov eax, 1xor ebx, ebxint 0x80```以上汇编代码将数字42和23相加,并将结果输出到屏幕上。
汇编语言拆字程序
![汇编语言拆字程序](https://img.taocdn.com/s3/m/788edb053069a45177232f60ddccda38366be151.png)
汇编语言拆字程序汇编语言拆字程序可以读取中文字符或字符串,并将其拆分成单个汉字或拼音。
这对于汉字输入和文本分析非常有用。
下面是一个简单的汇编语言拆字程序的代码:;; 这是一个简单的汇编语言拆字程序;; 作者:XXX;; 日期:XXXX年XX月XX日;; 定义一些常量和变量section .datainput_message db "请输入中文字符串(以'$'结束):", 0output_message db "拆分后的汉字或拼音:", 0buffer db 100result db 1000;; 定义程序入口section .textglobal _start;; 程序从这里开始执行_start:;; 输出提示信息并等待用户输入字符串mov eax, 4mov ebx, 1mov ecx, input_messagemov edx, 31int 0x80mov eax, 3mov ebx, 0mov ecx, buffermov edx, 99int 0x80;; 输出结果mov eax, 4mov ebx, 1mov ecx, resultmov edx, 999int 0x80上面的程序首先提示用户输入中文字符串,然后等待用户输入并存储到缓冲区中。
接下来,程序将回车和换行符替换为$符号,以便后面的拆分操作。
然后,程序遍历缓冲区中的每个字符,并将其存储到结果缓冲区中,直到找到$符号为止。
最后,程序输出拆分后的结果,并退出。
使用上述程序进行测试,你可以输入一个中文字符串并将其拆分成单个汉字或拼音。
注意,这是一个非常简单的示例程序,可能不能处理所有情况。
例如,程序将忽略符号和数字,并假定所有输入都是UTF-8编码的中文字符。
此外,程序还没有考虑多音字的情况。
如果你需要处理更复杂的输入,你可能需要使用更高级的技术,如编辑距离算法和拼音分词。
创建可以输入文字框 汇编代码
![创建可以输入文字框 汇编代码](https://img.taocdn.com/s3/m/c9e0d5c55122aaea998fcc22bcd126fff7055d38.png)
创建可以输入文字框汇编代码
1、连续输入字符串,到内窗口边界后跳到下一行;
2、任意位置按Enter键跳到下一行;
3、任意位置按ESC键就退出程序;
4、当输入到最后一行后,按Enter键和输入字符超过内窗口都会触发屏幕上卷,并跳到下一行;
5、屏幕上卷用了不同的底色,为了便于观察卷屏效果;
6、按退格键Backspace可以将光标往前移,这时候键入字符就会重写,可用于字符修正;
7、方向键、翻页键等其他按键都没有做功能,按下这些键只会显示按键的标志码;
8、一直按退格键会将光标移出内窗口,这个问题没有处理;
9、程序只是演示窗口输入和光标、内容控制,不保存字符串,只是写显存而已。
汇编语言程序代码
![汇编语言程序代码](https://img.taocdn.com/s3/m/65adc1116bd97f192279e9aa.png)
BEGIN: MOV AH, 1 ;从键盘输入一个字符的 DOS 调用 INT 21H SUB AL, ‘0’ JB STOP ;输入字符<‘0’吗? CMP AL, 9 ;输入字符>‘9’吗? JA STOP CBW MOV CX, AX ;响铃次数 N JCXZ STOP BELL: MOV DL, 07H ;准备响铃 MOV AH, 2 ;显示一个字符的 DOS 调用,实际为响铃 INT 21H CALL DELAY100ms ;延时 100ms LOOP BELL STOP: RET 5.6 编写程序,将一个包含有 20 个数据的数组 M 分成两个数组:正数数组 P 和负数数组 N, 并分别把这两个数组中数据的个数显示出来。 答:程序如下:
SHR AX, CL ;右移四次 DEC CH JNZ A10 ;循环四次完了码? B10: MOV DL, STORE ;四组数分别放在 AL、BL、CL 和 DL 中 MOV CL, STORE+1 MOV BL, STORE+2 MOV AL, STORE+3 STOP: RET 5.4 试编写一程序,要求比较两个字符串 STRING1 和 STRING2 所含字符是否完全相同,若相 同则显示‘MATCH’,若不相同则显示‘NO MATCH’。 答:程序如下:
DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取 AX 的低四位 MOV [BX], DL ;低四位存入 STORE 中 INC BX
CMP AL, 41H ;又<A 吗? JB INPUT ;不是‘A~F’的数重新输入 CMP AL, 46H ;>F 吗? JA INPUT ;不是‘A~F’的数重新输入 AND AL, 0FH ;转换为:1010B~1111B ADD AL, 9 BINARY: OR BL, AL ;将键盘输入的数进行组合 DEL CH JNZ INPUT DISPN: MOV CX, 16 ;将 16 位二进制数一位位地转换成 ASCII 码显示 DISP: MOV DL, 0 ROL BX, 1 RCL DL, 1 OR DL, 30H MOV AH, 2 ;进行显示 INT 21H LOOP DISP STOP: RET 代码转换; 查表法,实现一位 16 进制数转换为 ASCII 码显示
windows环境下32位汇编语言程序设计附书代码
![windows环境下32位汇编语言程序设计附书代码](https://img.taocdn.com/s3/m/faa3f067ae45b307e87101f69e3143323868f543.png)
windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
汇编语言源程序,实现10个有符号字型整数键盘输入,然后按反序输出所输入的10个有符
![汇编语言源程序,实现10个有符号字型整数键盘输入,然后按反序输出所输入的10个有符](https://img.taocdn.com/s3/m/44c2e62ea55177232f60ddccda38376bae1fe060.png)
汇编语言源程序,实现10个有符号字型整数键盘输入,然后按反序输出所输入的10个有符号字型整数。
引言:汇编语言是一种低级机器语言,用于编写计算机程序。
它直接操作计算机硬件,具有高效性和灵活性。
本文将介绍如何使用汇编语言编写一个程序,实现键盘输入10个有符号整数,并按反序输出这些整数。
正文:1. 输入模块1.1 初始化键盘输入在汇编语言中,我们可以使用BIOS中断来初始化键盘输入。
通过调用INT 16h中断,我们可以设置键盘输入的模式和功能。
在本例中,我们将设置键盘输入模式为扫描码模式,并启用键盘中断。
1.2 读取键盘输入使用INT 16h中断的另一个功能来读取键盘输入。
通过调用INT 16h中断的功能号为0h的子功能,我们可以从键盘缓冲区中读取一个字符。
我们可以使用循环来读取10个字符,并将它们存储在内存中的一个数组中。
1.3 转换字符为整数由于键盘输入的字符是ASCII码,我们需要将它们转换为整数。
在汇编语言中,可以使用SUB指令将字符的ASCII码值减去字符'0'的ASCII码值,从而得到整数值。
2. 反序输出模块2.1 初始化输出与键盘输入类似,我们可以使用BIOS中断来初始化屏幕输出。
通过调用INT 10h中断,我们可以设置屏幕输出的模式和功能。
在本例中,我们将设置屏幕输出模式为文本模式,并清空屏幕。
2.2 输出整数我们可以使用INT 10h中断的功能号为0Eh的子功能来在屏幕上输出字符。
通过循环,我们可以从存储整数的数组中读取整数,并将其转换为字符后输出。
2.3 反序输出为了按反序输出整数,我们可以使用两个指针,一个指向数组的开头,另一个指向数组的末尾。
通过交换两个指针所指向的元素,我们可以实现反序输出。
总结:通过使用汇编语言编写的程序,我们可以实现键盘输入10个有符号整数,并按反序输出这些整数。
通过初始化键盘输入和屏幕输出,以及使用循环和指针操作,我们可以实现这个功能。
完整的汇编程序
![完整的汇编程序](https://img.taocdn.com/s3/m/2a5ed5e881c758f5f61f678b.png)
题目:字符游戏1随机显示字符ch,等待用户输入如果输入字符与ch 一致,则随机显示下一个字符ch2;否则显示“输入错误”;如此循环;输入Enter结束点击Enter程序退出;程序清单:1、定义数据段、代DA TA SEGMENTSTR1 DB 0DH,0AH,'$'STR2 DB 'YOU ARE WRONG',0DH,0AH,'$'DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TAMOV DS,AXLP:MOV AH,2CH;读取秒的百分之一INT 21HMOV AL,DLMOV AH,0MOV BL,52DIV BLCMP AH,26JB CONTINUEADD AH,6CONTINUE:ADD AH,65MOV BH,AHMOV DL,AHMOV AH,2INT 21HCALL HHMOV AH,1INT 21HCALL HHCMP AL,0DHJE EXITCMP BH,ALJNE LP1JMP LPLP1:CALL CCJMP LPEXIT:MOV AH,4CHINT 21HHH PROC NEARPUSH AXPUSH DXLEA DX,STR1MOV AH,9INT 21HPOP DXPOP AXRETHH ENDPCC PROC NEARPUSH AXPUSH DXLEA DX,STR2MOV AH,9INT 21HPOP DXPOP AXRETCC ENDPCODE ENDSEND START汇编程序说明:1、定义数据段、代码段、堆栈段及其中所用到的变量2、调用2CH号功能,读取当前时间秒的百分之一除以52,余数作为产生随机字符的变量3、当上述变量在0~25之间时,利用JB跳转到CONTINUE。
在CONTINUE中将变量加上65得到大写字母A~Z吃的ASCII值,调用2号功能将其输出;调用子程序HH实现换行后调用1号功能实现键盘输入字符;此字符若是ENTER,退出程序,若与现实的字符相同,继续步骤2,若不同,挑战到CC,显示YOU ARE WRONG4、当上述变量在26~51之间时直接执行CONTINUE指令,与3同5、定义指令语句LP1实现调用过程CC和跳转到步骤2;定义指令语句EXIT,调用4CH功能实现退出程序;6、定义过程HH,调用9号功能,实现换行;定义过程CC实现输入的字符与现实的现实的字符不一致的时候显示YOU ARE WRONG7、代码段结束,程序结束。
打字游戏源代码 汇编语言
![打字游戏源代码 汇编语言](https://img.taocdn.com/s3/m/8fe2dc15de80d4d8d15a4fcc.png)
Init_game macro op1,op2,op3,op4,op5,op6mov cx,00hmov dh,op1mov dl,op2op6:mov ah,02hmov bh,00hint10hpush cxmov ah,0ahmov al,op3mov bh,00hmov cx,01hint10hpop cxinc cxinc op4cmp cx,op5jne op6endm(1)clear_screen macro op1,op2,op3,op4;前文设计思想中(1)部分,这是一个清屏宏定义。
op1、op2是字符显示处的行列坐标,op3、op4是光标所在位置的坐标。
mov ah,06hmov al,00hmov bh,07hmov ch,op1mov cl,op2mov dh,op3mov dl,op4int10hmov ah,02hmov bh,00hmov dh,00hmov dl,00hint10hendmmenu macro op1,op2,op3mov ah,02hmov bh,00hmov dh,op1mov dl,op2int10hmov ah,09hlea dx,op3int21hendm==========================================(2)data segment这是数据段的代码,其中要定义菜单的内容,界面上方的字母乱序,给字母乱序留出的数据空间,以及字母下落的速度。
meg db"Let us have a game!!Come on!!$"meg1db"**Select Menu**$"meg2db"Please select the game speed,ESC to quit.$"meg3db"1.Very slow Too easy,speed up!$"meg4db"2.Slow Everybody can deal.$"meg5db"3.Nomal I think you can deal!$"meg6db"4.Fast A challenge.Pay attention!$"meg7db"5.Very Fast Too hard,Have a try?$"meg8db"6.Fastest Are you crazy??$"meg9db"*Select the number among1-6and press ENTER to start!*$"meg10db"Game Speed Select:$"hotkey db"When you are playing games:$"hotkey1db"ESC to return to menu$"hotkey2db"SPACE to pause the game$"hotkey3db"Press any key to play games......$"hotkey4db"Are you ready??$"failmeg db"The letter is arrive the bottom,You are lost!:($"failmeg0db"Press ENTER to go on......$"failmeg1db"Game is over!$"failmeg2db"Press ENTER to return menu and press ESC to exit!$"failmeg3db"Bye-Bye!Thank for your playing!!$"failmeg4db"Press any key to quit......$"speed dw00d,1200d,800d,600d,400d,200d,100dletters db"jwmilzoeucgpravskntxhdyqfb"db"iytpkwnxlsvxrmofzhgaebudjq"db"nwimzoexrphysfqtvdcgljukda"letters_bak db"jwmilzoeucgpravskntxhdyqfb"db"iytpkwnxlsvxrmofzhgaebudjq"db"nwimzoexrphysfqtvdcgljukda"letter_counter db0life_flag db78dup(0)position_flag db78dup(0)present_position db1data ends=============================================(3)stack segment para stack'stack'db256dup(0)stack ends=============================================(4)code segmentmain proc farassume cs:code,ds:data,ss:stackstart:clr0,0,24,79mov ax,datamov ds,axmov letter_counter,00hmov present_position,1lea si,position_flagmov ah,00hmov cx,00hinit_postion_flag:mov[si],ahinc siinc cxcmp cx,78djne init_postion_flaglea di,letterslea si,letters_bakmov cx,00hinit_letters:mov ah,[si]mov[di],ahinc siinc diinc cxcmp cx,78djne init_lettersmov ah,00hlea si,life_flagmov cx,00hinit_life_flag:mov[si],ahinc siinc cxcmp cx,78djne init_life_flagmov cx,00hmov ah,01hor ch,00010000bint10hclear_screen00d,00d,24d,79dInit_game00d,00d,0ah,dl,80d,nextsign1Init_game24d,00d,0ah,dl,80d,nextsign2Init_game00d,00d,0ah,dh,25d,nextsign3Init_game00d,79d,0ah,dh,25d,nextsign4menu01d,15d,meg;菜单信息的宏展开menu01h,61d,linjiangmenu03d,20d,meg1menu03d,68d,nomenu05d,15d,meg2menu07d,15d,meg3menu09d,15d,meg4menu11d,15d,meg5menu13d,15d,meg6menu15d,15d,meg7menu17d,15d,meg8menu19d,15d,meg9menu22d,15d,meg10input:mov ah,02hmov bh,00hmov dh,22dmov dl,33dint10hmov ah,0ahmov al,""mov bh,00hmov cx,01hint10hmov ah,01hint21hretry::cmp al,"1"je speed1cmp al,"2"je speed2cmp al,"3"je speed3cmp al,"4"je speed4cmp al,"5"je speed5cmp al,"6"je speed6cmp al,1bhjmp inputto_over0:jmp overspeed1:mov ah,01hint21hcmp al,0dh;输入enter开始jne otherkeymov ax,speed+2mov speed,axjmp beginspeed2:mov ah,01hint21hcmp al,0dhjne otherkeymov ax,speed+4mov speed,axjmp beginspeed3:mov ah,01hint21hcmp al,0dhjne otherkeymov ax,speed+6mov speed,axjmp beginspeed4:mov ah,01hint21hcmp al,0dhjne otherkeymov ax,speed+8mov speed,axjmp beginspeed5:mov ah,01hint21hcmp al,0dhjne otherkeymov ax,speed+10mov speed,axjmp beginspeed6:mov ah,01hint21hcmp al,0dhjne otherkeymov ax,speed+12mov speed,axotherkey:;处理重复输入的代码段push axmov ah,02hmov bh,00hmov dh,22dmov dl,34dint10hmov ah,0ahmov al,""mov bh,00hmov cx,01hint10hmov ah,02hmov bh,00hmov dh,22dmov dl,33dint10hpop axmov dx,axmov ah,02hint21hjmp retrybegin:clear_screen01d,01d,23d,78d;清屏宏调用menu08d,20d,hotkeymenu10d,20d,hotkey1menu12d,20d,hotkey2menu14d,20d,hotkey4menu16d,20d,hotkey3mov ah,07hint21hclear_screen01d,01d,23d,78dInit_game23d,01d,01h,dl,78d,nextsign5mov ah,02h;光标初始化,设置光标位置mov bh,00hmov dh,01hmov dl,01hint10hmov cx,00hlea si,lettersnextletter:;初始化屏幕上方的字母mov ah,02hmov dl,[si]inc siinc cxcmp cx,78dje nextcyclejmp nextletterfrom_front:;相关循环的算法sub present_position,78djmp gobackto_sifind_zero:cmp letter_counter,78dje recyclecmp present_position,78dje from_onemov ah,00hnext si:add present_position,01hinc sicmp[si],ahje gobackto_dicmp present_position,78dje from_onejmp nextsifrom_one:mov present_position,01hjmp gobackto_sirecycle:mov letter_counter,00hmov present_position,01dlea si,position_flagmov cx,00hmov ah,00hclearsi:mov[si],ahinc cxcmp cx,78dje nextcycleinc sijmp clearsinextcycle:lea di,letterslea si,position_flagadd present_position,31d;加31产生随机字母cmp present_position,78ja from_frontgobackto_si:add si,word ptr present_positiondec simov ah,[si]cmp ah,01hje find_zerogobackto_di:mov ah,01hmov[si],ahadd di,word ptr present_positiondec dimov dl,present_positionmov ah,02h;字母下落的代码段部分mov bh,00hmov dh,01hint10hmov cx,00hnextrow:push cx;新的一行mov cx,00hout_cycle:;延迟push cxmov cx,00hin_cycle:add cx,01hcmp cx,65535;字符在每一位置所停留时间,延迟jne in_cyclepush dx;保存之前字符位置mov ah,06h;从键盘输入字符mov dl,0ffhint21hpop dxjz pass;如果键盘缓冲区部分为空,则跳转cmp al,1bh;如果键入esc,则返回主菜单je to_start1t6cmp al,"";如果键入space,则游戏暂停je pausecmp al,[di];输入字母正确!跳转!字母消失je disappearpass:pop cx;cx=0inc cxcmp cx,speed;字符下落速度,也起延迟作用je printjmp out_cyclepause:push dx;暂停处理,继续等待输入mov ah,06hmov dl,0ffhpop dxcmp al,""jne pausejmp pass;若输入空格则继续to_start1:;返回主菜单jmp startprint:mov ah,0ah;在当前光标位置写空格mov al,""mov bh,00hmov cx,01hint10hinc dhmov ah,02h;改变光标位置mov bh,00hint10hmov ah,0ah;在当前光标位置写字母mov al,[di]mov bh,00hmov cx,01hint10hpop cxinc cxcmp cx,21dje print_next_letterjmp nextrow;下一行disappear:;击中字母后的相关处理,输出空格pop cxpop cxmov ah,0ahmov al,""mov bh,00hmov cx,01hint10hjmp hitprint_next_letter::;处理原位置的空缺lea si,life_flagadd si,word ptr present_positiondec simov ah,[si]cmp ah,1je failmov ah,0ahmov bh,00hmov cx,01hint10hinc dhmov ah,02hmov bh,00hint10hmov ah,0ahmov al,""mov bh,00hmov cx,01hint10hmov ah,1mov[si],ahhit:mov ah,02hmov bh,00hmov dh,01hmov dl,present_positionint10hmov al,[di];出现下一个新字母的算法add al,7cmp al,7ah;超过z则转移ja convey_lettermov ah,0ah;当前位置显示新字符mov bh,00hmov cx,01hint10hmov[di],aladd letter_counter,01h;计数加1jmp nextcycleconvey_letter:sub al,7ahadd al,61hmov ah,0ahmov bh,00hmov cx,01hint10hmov[di],aladd letter_counter,01h;计数加1jmp nextcyclefail:mov ah,0ah;游戏失败后的相关处理mov al,""mov cx,01hint10hinc dhmov ah,02hmov bh,00hint10hmov ah,0ahmov al,[di]mov bh,00hmov cx,01hint10hmov ah,02hmov bh,00hmov dh,12dmov dl,17dint10hpush dxmov ah,09hlea dx,failmegint21hpop dxadd dh,2mov ah,02hmov bh,00hint10hmov ah,09hlea dx,failmeg0int21hre:mov ah,07hint21hcmp al,0dhjne reclear_screen01,01,23,78mov ah,02hmov bh,00hmov dh,11dmov dl,20dint10hpush dxmov ah,09hlea dx,failmeg1int21hpop dxinc dhinc dhmov ah,02hmov bh,00hint10hmov ah,09hlea dx,failmeg2int21hnotkey:mov ah,07hint21hcmp al,0dhje to_startcmp al,1bhje overjmp notkeyto_start:clear_screen00,00,24,79jmp startover:clear_screen01,01,23,78mov ah,02hmov bh,00hmov dh,11dmov dl,15hint10hmov ah,09hlea dx,failmeg3int21hmov ah,02hmov bh,00hmov dh,13dmov dl,15hint10hmov ah,09hlea dx,failmeg4int21hmov ah,07hint21hmov ah,07hint21hclear_screen00,00,24,79mov ax,4c00hint21hmain endpcode endsends start。
汇编打字程序完整代码
![汇编打字程序完整代码](https://img.taocdn.com/s3/m/fe591b13b7360b4c2e3f64bc.png)
汇编打字程序完整代码已经经过测试,可以直接使用Init_game macro op1,op2,op3,op4,op5local nsmov cx,00hmov dh,op1mov dl,op2ns:mov ah,02h;设置光标位置mov bh,00h;页号为0int 10hpush cxmov ah,0ah;在当前光标位置写字符mov al,op3;al=字符的ascii码mov bh,00h;bh=页号bl=字符属性mov cx,01h;cx=写入字符重复次数int 10hpop cx;cx=0inc cx;cx=cx+1inc op4cmp cx,op5jne nsendmclear_screen macro op1,op2,op3,op4 ;清屏宏定义cx,屏幕的左上角,dx屏幕的右下角mov ah,06hmov al,00hmov bh,0ah;改变行属性的色彩,字的色彩,bh空白行的属性/07就是正常的黑底白字mov ch,op1mov cl,op2mov dh,op3mov dl,op4int 10hmov ah,02h;设置光标的位置从0000开始mov bh,00hmov dh,00hmov dl,00hint 10hendmmenu macro op1,op2,op3 ;菜单显示宏定义mov ah,02hmov bh,00hmov dl,op2int 10hmov ah,09hlea dx,op3int 21hendmdata segmentZK db "WELCOME TO PLAY!$"no db "date:2014/4/7 BY luozhilei QQ:1121364692 $"meg db "press Enter to start.......$"meg1 db "when a letter is dropping,please hit it!(just press the$ " meg2 db "dropping letter,so easy!)$"meg3 db "press space key to pause!repress space to continue!$" meg4 db "press ESC key to return main menu!$"meg5 db "press letter 'E' to exit!$"meg6 db "version 1.0","$"speed dw 600dletters_bak db "jwmilzoeucgpravskntxhdyqfb"db "iytpkwnxlsvxrmofzhgaebudjq"db "nwimzoexrphysfqtvdcgljukda"letters db 78d dup(0)letter_counter db 0life_flag db 78 dup(0)position_flag db 78 dup(0)present_position db 1data endsstack segment para stack 'stack'db 64 dup(0)stack endscode segmentmain proc farassume cs:code,ds:data,ss:stackstart: mov ax,datamov ds,axmov letter_counter,00hmov present_position,1lea si,position_flag;mov ah,00hmov cx,00h------------------------------------lea di,letters;di的偏移地址为letterslea si,letters_bak;si的偏移地址为letter_bakmov cx,00h;cx=0mov ah,[si];ah=jmov [di],ah;ah的值放到letters里面;letters_bak的值放入letters里面inc si;si+1inc di;di+1inc cx;cx+1cmp cx,78d;jne init_letters;不为0就到init_letters,一直循环到letters里mov ah,00hlea si,life_flag;mov cx,00hover后,自动回去吧init_life_flag:mov [si],ahinc siinc cxcmp cx,78djne init_life_flag;-----------------------------------------------------------------------mov cx,00h ;ch=光标开始行,cl=光标结束行根据CX给出光标的大小mov ah,01hor ch,00010000b;ch>20h,光标消失,cl>20h,覆盖字符int 10hclear_screen 00d,00d,24d,79d ;清屏,0000- 2479Init_game 00d,00d,07h,dl,80d ;这个四个是初始化屏幕的上下左右的框框Init_game 24d,00d,07h,dl,80dInit_game 00d,00d,07h,dh,25dInit_game 00d,79d,07h,dh,25dmenu 05d,15d,ZK ;菜单信息的宏调用,这五行是在屏幕上显示提示消息menu 07h,15d,nomenu 09d,15d,megmenu 11d,15d,meg1menu 13d,10d,meg2menu 15d,15d,meg3menu 17d,15d,meg4menu 19d,15d,meg5menu 21d,15d,meg6put: mov ah,02h ;设置光标位置mov bh,00h;设置页码mov dh,22d;dx行列坐标mov dl,33dint 10hmov ah,01h ;从键盘输入任意字符并回显示,al=输入字符int 21hcmp al,0dh;是否为换行符je speed3;如果是换行符则跳转到speed3处cmp al,45h;比较是否为eje exit;如果为e,转到exitexit: mov ah,4chint 21hspeed3:mov ax,speed+12mov speed,axjmp beginbegin: clear_screen 01d,01d,23d,78d ;清屏宏调用; clear_screen 01d,01d,23d,78dInit_game 23d,01d,03h,dl,78d;23d01d行列坐标,初始化倒数第二行的字符mov ah,02hmov bh,00hmov dh,01hmov dl,01hint 10hmov cx,00hlea si,letters ;si的偏移地址是lettersnextletter:mov ah,02h ;显示字母mov dl,[si] ;把letters的字符放到dl里int 21h ;通过dos中断的2号功能项,把字符显示出来inc siinc cxcmp cx,78dje nextcycle;全部显示完了后,跳到nextcyclejmp nextletterfrom_front:sub present_position,78d ;当超过78个字时的处理方式减去78jmp gobackto_si;跑到gobackto_si这来find_zero:cmp letter_counter,78d ;letter_counter有78了,初始化je recycle;如果有跑到recyclecmp present_position,78d;如果present_position等于78d,je from_onemov ah,00hnextsi: add present_position,01hinc sicmp [si],ahje gobackto_dicmp present_position,78dje from_onejmp nextsifrom_one:mov present_position,01h ;present_position=01jmp gobackto_si;---------------------------------------------------------------------------------------recycle:mov letter_counter,00h;letter_counter=0mov present_position,01d;present_position=01lea si,position_flag;si=position_flag的偏移地址mov cx,00hmov ah,00hclearsi:mov [si],ah;position_flag地址搞成0inc cxcmp cx,78dje nextcycleinc sijmp clearsinextcycle:lea di,letters;di的偏移地址是letters[字母]lea si,position_flag;si的偏移地址是position_flagadd present_position,31d;31一跳,这个你可以随便设置cmp present_position,78d;;超过78个字节ja from_front;------------------------------------------------------------------------------------------------gobackto_si:add si,word ptr present_position;si=si+present_position,si向后偏移dec si; 要不要都无所谓,只不过,因为开始就觉定了是要31一跳,所以这里减一个1位mov ah,[si];把position_flag放到ah里cmp ah,01h;看看position_flag里面有没有标志1je find_zero;如果ah为1转移,否则gobackto_di:mov ah,01hmov [si],ahadd di,word ptr present_positiondec di;因为列坐标是从0开始,而字符是从1开始,所以这里是32-1mov dl,present_position;mov ah,02hmov bh,00hmov dh,01hint 10hmov cx,00h;------------------------------------------------------------------------------------------------------------------------nextrow: push cxmov cx,00hout_cycle: ; 延迟push cxmov cx,00hin_cycle:add cx,01hcmp cx,1000 ;jne in_cycle ;zf=0转到标号处执行,push dxmov ah,06h ;从键盘输入字符,al等于字符mov dl,0ffhint 21hpop dxjz passcmp al,1bh ;如果键入ESC,则返回主菜单je to_start1cmp al," " ;如果键入SPACE,则游戏暂停je pausecmp al,[di] ;输入字母正确!则字母消失je disappearpass: pop cxinc cxcmp cx,speedje printjmp out_cyclepause: push dx mov ah,06hmov dl,0ffhint 21hpop dxcmp al," "jne pausejmp passto_start1: ;返回主菜单jmp startprint:mov ah,0ah ;在当前光标位置写空格mov al," "mov bh,00hmov cx,01hint 10hinc dhmov ah,02h ;改变光标位置mov bh,00hmov ah,0ah ;在当前光标位置写字母mov al,[di]mov bh,00hmov cx,01hint 10hpop cxinc cxcmp cx,21dje print_next_letterjmp nextrow ;下一行disappear: ;击中字母后输出空格pop cxpop cxmov ah,0ah;在光标处按原来属性显示字符mov al," "mov bh,00hmov cx,01hint 10hjmp hitprint_next_letter:lea si,life_flagadd si,word ptr present_positiondec simov ah,0ah;在当前光标处按原有属性显示字符mov al," ";最倒数第二排写入字符,意思是当掉下来的字符到倒数第二行的时候,自动变成空格消失mov bh,00hmov cx,01hint 10hinc dh ;这就是到了最后一行mov ah,02hmov bh,00hint 10hmov ah,0ah;把最后一行的字符变成空格mov al," "mov bh,00hmov cx,01h;重复输出,这里的重复输出的意思就是输入一个空格int 10hmov ah,1;把life_flag变成1,这样下次就可以不在同一个位置掉字符下来mov [si],ahhit: mov ah,02h;设置光标mov bh,00hmov dh,01h;第一行mov dl,present_position;下一个字符的列mov al,[di] ; 出现下一个新字母的数法add al,7;di+7cmp al,7ah;z的ascii码就是7ah,所以当al大于7ah时转移ja convey_lettermov ah,0ah;在当前光标按原有属性显示字符,al=字符mov bh,00hmov cx,01hint 10hmov [di],aladd letter_counter,01h;统计次数jmp nextcycleconvey_letter:sub al,7ahadd al,61h;al等于要显示的字符,加61表示是小写字母mov ah,0ahmov bh,00hmov cx,01hint 10hmov [di],aladd letter_counter,01hjmp nextcycle ;没弄懂作者这里是什么意思,到了这里就jmp了那写下面的程序做屁clear_screen 01,01,23,78mov ah,02hmov bh,00hmov dh,11dmov dl,20dint 10hinc dhinc dhmov ah,02hmov bh,00hint 10hnotkey:mov ah,07hint 21hcmp al,0dhje to_startcmp al,1bhje overjmp notkeyto_start:clear_screen 00,00,24,79jmp startover: clear_screen 01,01,23,78 mov ah,02hmov bh,00hmov dh,11dmov dl,15hint 10hmov ah,02hmov bh,00hmov dh,13dmov dl,15hint 10hmov ah,07hint 21hmov ah,07hint 21hclear_screen 00,00,24,79 mov ax,4c00hint 21hmain endpcode endsend start。
键盘代码大全(完整)
![键盘代码大全(完整)](https://img.taocdn.com/s3/m/b951d9d6c1c708a1284a443d.png)
113
4b
75
K
14
0c
12
ff
114
4c
76
L
15
0d
13
er
115
4d
77
M
16
0e
14
so
116
4e
78
N
17
0f
15
si
117
4f
79
O
20
10
16
dle
120
50
80
P
21
11
17
dc1
121
51
81
Q
22
12
18
dc2
122
52
82
R
23
13
19
dc3
123
53
83
S
24
14
20
dc4
Bin
Dec
Hex
缩写/字符
解释
00000000
0
00
NUL(null)
空字符
00000001eadling)
标题开始
00000010
2
02
STX (start of text)
正文开始
00000011
3
03
ETX (end of text)
正文结束
00000100
方向键(↑): VK_UP (38)
方向键(→): VK_RIGHT (39)
方向键(↓): VK_DOWN (40)
F1键: VK_F1 (112)
F2键: VK_F2 (113)
F3键: VK_F3 (114)
汇编语言代码
![汇编语言代码](https://img.taocdn.com/s3/m/d88db86c783e0912a2162aa9.png)
汇编语言编写从键盘输入一段字符串然后逆序输出DATA SEGMENTDB 512 DUP('$') ;定义可输入的字符个数BUF DB '$'CRLF DB 0DH,0AH,24H ;回车换行符DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,OFFSET BUF ;指针指向待显示字符串尾部AGAIN:MOV AH,01 ;输入字符INT 21HCMP AL,0DH ;是回车吗JE DISP ;是,转显示DEC BX ;指针减1MOV [BX],AL ;存入输入的字符JMP AGAIN ;继续输入DISP:MOV AH,09 ;显示MOV DX,OFFSET CRLF ;回车换行INT 21HMOV DX,BX ;定位待显示字符串首地址MOV AH,09INT 21H ;显示MOV AH,4CH ;DOS返回INT 21HCODE ENDSEND START; 本程序通过编译,运行正确Code SegmentAssume CS:Code,DS:Code; -----------------------------------------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addrlea dx,Str_Addrmov ah,9int 21hEndM; -----------------------------------------; 功能:输出一个字符; 入口:dl=要显示的字符Enter_Chr proc Nearpush axmov ah,02hint 21hpop axretEnter_Chr endp; -----------------------------------------; 功能:输出回车换行Enter_CTLF proc Nearpush axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hpop dxpop axretEnter_CTLF endp; -----------------------------------------Prompt_Str db 'Please input a string: $' ;输入字符串提示信息Start: push cspop dspush cspop es ;使数据段、附加段与代码段同段Output Prompt_Str ;提示输入字符串lea dx,Buffermov ah,0ah ;从键盘接受一串字符int 21hCALL Enter_CTLF ;输出一个回车、换行CALL Enter_CTLF ;输出一个回车、换行cldlea si,Buffer[1] ;实际输入的字符个数地址mov cl,[si] ;读入实际输入的字符个数test cl,0ffhjz Exit_Proc ;直接回车,没有输入任何字符,结束程序,返回操作系统xor ch,ch ;cx=实际输入的字符个数add si,cx ;字符串尾部地址std ;置方向标志,使变址寄存器自动减量Disp_String:lodsbmov dl,alcall Enter_Chr ;显示一个字符loop Disp_StringExit_Proc: mov ah,4ch ;结束程序int 21hBuffer db 100,?Code ENDSEND Start ;编译到此结束从键盘输入一字符串(不超过255个字符)以相反顺序输出data segmenta db ? dup(?)data endseseg segmentb db ? dup(?)eseg endscode segmentassume cs:codestart:mov ah,0ahint 21hmov bl,allea si,alea di,badd di,n-1mov cx,nmove:cldlodsbstdstosbloop movemov ah,4chint 21hcode endsend start解答:data segment;a db ? dup(?)a db 255,0,255 dup(?)data endseseg segment;b db ? dup(?)b db 255 dup(?)eseg endscode segment;assume cs:codeassume cs:code,ds:data,es:esegstart:mov ax,data ;新增mov ds,ax ;mov ax,eseg ;mov es,ax ;mov dx,offset a ;学习0AH号DOS功能调用mov ah,0ahint 21h;mov bl,al mov ch,0 ; mov cl,a+1 ; ;lea si,a lea si,a+2 lea di,b;add di,n-1 add di,cx dec di;mov cx,n move:cld lodsbstdstosbloop move mov ah,4ch int 21h code ends end start;输入字符串去空格后反向输出的程序.model small.386DATA SEGMENTbuf db 100, 0 ,100 DUP (0)msg1 db 'Please input a string: ',0DH,0Ah,'$'crlf db 0Dh,0Ah,'$'leng db 0DATA ENDSSTACK SEGMENTDB 64 DUP (?)STACK ENDSCODE SEGMENTassume cs:CODE,ds:DATA,es:DATA,ss:STACKSTART:mov ax,DATAmov ds,axmov es,axlea dx,msg1 ;输出提示文字mov ah,09hint 21hlea dx,bufmov ah,0ah ;接受字符串int 21h;mov dx,offset crlfmov ah,09h ;输出字符串中断int 21hcall countcall nospace;把这行去掉之后是可以实现反向输出的,当然不能去空格lea dx,bufmov bl,leng;新字符串长度送到blmov bh,00hcmp bx,0000hjnz L1jz EXITL1:mov dl,buf+1[bx] ;把最后一位送到dl mov ah,02h ;输出一个字符中断int 21hdec bx ;倒着输出字符jnz l1EXIT:mov AH,4CHint 21Hcount:xor dx,dxxor cx,cxlea di,bufpush dimov al,0lop:cmp al,[di]je doneinc dlinc diloop lopdone:mov leng,dl;把数组长度存至lengpop diretnospace:push sipush dipush axpush bxpush cxlea si,bufadd si,2 ;读指针simov di,si ;写指针dixor ch,chmov cl,[si-1] ;字符数组长度cldxor bl,bl ;新的字符长度L2:lodsb ;读取字符cmp al,' 'je L3 ;如果是空格,跳过保存操作 stosb ;保存字符inc bl ;记录长度L3:loop L2mov leng,blpop cxpop bxpop axpop dipop siretCODE ENDSEND START字符串逆序输出data segmentstring db 100,?,100 dup(0) data endscode segmentassume cs:code,ds:data start:mov ax,datamov ds,axlea dx,stringmov ah,0ahint 21hlea bx,string+1mov cl,[bx]mov ch,0add bx,cxnext:mov dl,[bx]mov ah,2int 21hdec bxloop nextmov ah,4chint 21hcode endsend start提示一下,小写跟大写字母的ASCII码值就差32,例如‘a’=97=61h,'A'=41h=65,所以只要将小写字母-20h即可,先简单写个,没运行,参考一下吧MOV DX,DATAMOV DS,DXLEA DX,BUFMOV AH,0AHINT 21HMOV DI,OFFSET BUFMOV CL,[DI+1]XOR CH,CHADD DI,2NEXT:CMP [DI],'a'JB NEXT1CMP [DI],'z'JA NEXT1SUBB [DI],20HINC DINEXT1:LOOP NEXTMOV DI,OFFSET BUFMOV CL,[DI+1]XOR CH,CHADD DI,2ADD DI,CX-1DISP:MOV DL,[DI]MOV AH,2INT 21HINC DILOOP DISP利用10号功能调用从键盘输入长度为8的字符串,回车键结束,然后将其逆序输出DATA SEGMENTBUF DB 8DB ?DB 8 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV DX,DATAMOV DS,DXMOV AH,0AHMOV DX,OFFSET BUFINT 21HLEX BX,BUFMOV CX,[BX+1]ADD BX,9LOOP1:MOV DL,[BX]MOV AH,02HINT 21HLOOP LOOP1MOV AH,4CHINT 21HCODE ENDSEND START。
【汇编】从键盘输入字符串并输出该字符串(汇编程序)
![【汇编】从键盘输入字符串并输出该字符串(汇编程序)](https://img.taocdn.com/s3/m/9b0283d65ebfc77da26925c52cc58bd6318693af.png)
【汇编】从键盘输⼊字符串并输出该字符串(汇编程序)原⽂地址/s/blog_4b7bd3380100a76z.html1 DATAS SEGMENT2STR DB"please input a string:$"3 BUF DB 204 DB ?5 DB 20 DUP (?)6 CRLF DB 0AH,0DH,"$";此处输⼊数据段代码7 DATAS ENDS8 STACKS SEGMENT STACK9 DB 200 DUP(?) ;此处输⼊堆栈段代码10 STACKS ENDS1112 CODES SEGMENT13 ASSUME CS:CODES,DS:DATAS,SS:STACKS14START:MOV AX,DATAS15MOV DS,AX16LEA DX,STR17MOV AH,918INT 21H19MOV AH,1020LEA DX,BUF21INT 21H22LEA DX,CRLF23MOV AH,924INT 21H25MOV CL,BUF+126LEA SI,BUF+227NEXT:MOV DL,[SI]28MOV AH,229INT 21H30INC SI31DEC CL32JNZ NEXT;此处输⼊代码段代码33MOV AH,4CH34INT 21H35 CODES ENDS36 END START以上是从键盘输⼊字符串并输出该字符串的简单汇编程序以下是整理的对上⾯程序的部分解释:BUF:键盘缓冲区BUF。
DB:定义变量的类型为字节类型。
DB 20:表⽰缓冲区能容纳20个字符。
DB 200 DUP(?)中的问号:不对分配的存储单元初始化。
DS:存放当前数据段的段地址。
CS:存放当前代码段的段地址。
SS:存放当前堆栈段的段地址。
MOV:传送指令。
AX:存放接收到的数据或发送数据。
DX:使⽤间接寻址时存放端⼝地址。
LEA:取偏移地址。
CL:在移位指令和循环移动指令中,存放移位次数或者循环移位次数。
汇编语言程序代码
![汇编语言程序代码](https://img.taocdn.com/s3/m/79f40c73f46527d3240ce01b.png)
MOV(MOVe)传送指令PUSH 入栈指令POP 出栈指令XCHG(eXCHanG)交换指令XLAT(TRANSLATE)换码指令LEA (Load Effective Address)有效地址送寄存器指令LDS(Load DS with pointer)指针送寄存器和DS指令LES(Load ES with pointer)指针送寄存器和ES指令LAHF(Load AH with Flags)标志位送AH指令SAHF(Store AH into Flgs) AH送标志寄存器指令PUSHF(PUSH the Flags)标志进栈指令POPF(POP the Flags)标志出栈指令ADD 加法指令ADC 带进位加法指令INC 加1指令SUB(SUBtract)不带借位的减法指令SBB(SuVtrach with borrow)带借位的减法指令DEC(DECrement)减1指领NEG(NEGate)求补指令CMP(CoMPare)比较指令MUL(unsinged MULtiple)无符号数乘法指令IMUL(sIgned MUL tiple)有符号数乘法指令DIV(unsigned DIVide)无符号数除法指令IDIV(sIgned DIVide)有符号数除法指令CBW(Count Byte to Word)字节转换为字指令CWD(Count Word to Doble word)字转换为双字指令DAA 压缩的BCD码加法十进制调整指令DAS 压缩的BCD码减法十进制调整指令AAA 非压缩的BCD码加法十进制调整指令AAS 非压缩的BCD码加法十进制调整指令AND 逻辑与指令OR 逻辑或指令XOR 逻辑异或指令NOT 逻辑非指令TEST 测试指令SHL(SHift logical Letf)逻辑左移指令SHR(SHift logical Right)逻辑右移指令ROL(Rotate Left )循环左移指令ROR(Rotate Right)循环右移指令RCL(Rotate Left through Carry)带进位循环左移RCR(Rotate Right through Carry)带进位循环左移MOVS(MOVe String)串传送指令STOS(STOre into String)存入串指令LODS(LOad from string)从串取指令REP(REPeat)重复操作前缀P61CLD(CLear Direction flag)清除方向标志指令STD(SeT Direction flag)设置方向标志指令CMPS(CoMPare String)串比较指令SCAS(SCAn String)串扫描指令REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀IN(INput)输入指令OUT(OUTput)输出指令JMP(JuMP)无条件转移指令JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令LOOP 循环指令LOOPZ/LOOPE 为零/相等时循环指令LOOPNZ/LOOPNE 不为零/不相等时循环指令CALL 子程序调用指令RET(RETun)子程序返回指令CLC(CLear Carry)进位位置0指令CMC(CoMplement Carry)进位位求反指令SRC(SeT Carry)进位位置1指令NOP(No OPeretion)无操作指令HLT(HaLT)停机指令OFFSET 返回偏移地址SEG 返回段地址EQU(=)等值语句PURGE 解除语句DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令ASSUME 段地址分配指令ORG 起始偏移地址设置指令$ 地址计数器的当前值PROC,ENDP 过程定义语句NAME,TITLE,END 程序开始结束语句MACRO,ENDM 宏定义指令P99。
(完整word版)汇编语言指令大全
![(完整word版)汇编语言指令大全](https://img.taocdn.com/s3/m/838a95ffec3a87c24128c407.png)
的十进制数数且仍存于 AL 中.
否则(AL)<--(AL) and 0FH
ADC
带进位加法指令 ADC(Addition Carry)
说明:
格式: ADC OPRD1,OPRD2
1. OPRD1 为任一通用寄存器或存储器操作数,可以是任意一个通用寄
功能: OPRD1<--OPRD1 + OPRD2 + CF
CMPSW
个字符串是否相同,可以使用循环控制方法对整串进行比较.
功能: 由 SI 寻址的源串中数据与由 DI 寻址 3. 与 MOVS 相似,CMPS 指令也可以不使用操作数,此时可用指令 CMPSB
的目的串中数据进行比较,比较结果送标志 或 CMPSW 分别表示字节串比较或字串比较.
位,而不改变操作数本身.
进制数存在 AL 中.
(AL)<--(AL)MOD10
2. 本指令应跟在 MUL 指令后使用,乘积的两位十进制结果,高位放在
AH 中,低位放在 AL 中.AH 内容是 MUL 指令的结果被 10 除的商,即
(AL)/10,而最后的 AL 内容是乘积被 10 整除的余数(即个位数).
AAS
未组合十进制减法调整指令 AAS(ASCII
1. 调整操作如下
格式: DAA
(1) 若(AL) and 0FH>9 或 AF=1,则(AL)<--(AL)+6,AF<--1,对低四位
功能: 对 AL 中的两个组合进制数相加的结果 的调整.
进行调整,调整结果仍放在 AL 中,进位标志放 (2) 若(AL) and 0F0H>90H 或 CF=1,则(AL)<--(AL)+60H,CF<--1.
汇编程序
![汇编程序](https://img.taocdn.com/s3/m/c24b9935dd36a32d7275810d.png)
1.编写程序,从键盘输入一字符串(字符个数不超过80,用回车符结束),统计其中字母、数字及其它字符的个数,分别存入letter、digit和other三个变量中。
;***本文件为DOS.exe标准模板文件***;//////////////////////////////////////////////////////////////////;程序名:;作者:;完成日期:;程序说明:;//////////////////////////////////////////////////////////////////.model small.data ;数据段;string db 'Hello, Everybody !',0dh,0ah,'$';此处添加一些初始化过的变量定义string1 db 'please input a string:',0dh,0ah,'$'string2 db 'number of letters:',0dh,0ah,'$'string3 db 'number of digits:',0dh,0ah,'$'string4 db 'number of others:',0dh,0ah,'$'letters db 0digit db 0others db 0.const;此处添加一些常量定义.code ;代码段开始.startup ;程序起始点,建立DS、SSlea dx,string1mov ah,09hint 21hmov cx,100w1:mov ah,01hint 21hcmp al,0dhjz over2cmp al,30hjb othercmp al,39hja higher1jmp digitalhigher1:cmp al,41hjb otherja higher2jmp letterhigher2:cmp al,61hjb othercmp al,7Ahja otherjmp letterjmp overother:inc othersjmp overletter:inc lettersjmp overdigital:inc digitjmp overjmp overover:noploop w1 over2:call endlinelea dx,string2mov ah,09hint 21hxor ax,axmov al,letterscall displaycall endlinelea dx,string3mov ah,09hint 21hxor ax,axmov al,digitcall displaycall endlinelea dx,string4int 21hxor ax,axmov al,otherscall displaymov ah,4chint 21hendline proc nearmov ah,02hmov dl,0Ahint 21hmov ah,02hmov dl,0dhint 21hretendline endpdisplay proc nearmov bl,10div blpush axmov dl,aladd dl,30hmov ah,02hint 21hpop axmov dl,ahadd dl,30hmov ah,02hint 21hretdisplay endp.exit 0 ;程序结束点,返回DOSend1.编写程序,在数据段定义两个长度相等的字符串STRING1和STRING2,从键盘输入一个字符串并存入STRING1,再将STRING1内容传送到STRING2.model small.data ;数据段string3 db 'please input a string1:' ,0dh, 0ah, '$'string4 db 'send successful,output a string2:',0dh,0ah,'$' string1 db 81db 0db 81 dup(?)string2 db sizeof string1 dup(?).const;此处添加一些常量定义.code ;代码段开始.startup ;程序起始点,建立DS、SSlea dx,string3mov ah,09hint 21hmov ah,0ahmov dx,offset string1int 21hmov ah,2mov dl,0ahint 21hmov bl,string1+1mov bh,0mov byte ptr[string1+2+bx],'$'mov si,offset string1[2]mov di,offset string2next: cmp byte ptr [si],'$'je donemov ax,[si]mov [di],axinc siinc dijmp nextdone: mov ah,09hlea dx,string4int 21hmov ah,09hmov dx,offset string2int 21h.exit 0 ;程序结束点,返回DOSend;//////////////////////////////////////////////////////////////////;程序名:;作者:;完成日期:;程序说明:;//////////////////////////////////////////////////////////////////.model small.data ;数据段;string db 'Hello, Everybody !',0dh,0ah,'$';此处添加一些初始化过的变量定义string1 db 'please input a string:',0dh,0ah,'$'string2 db 'number of letters:',0dh,0ah,'$'string3 db 'number of digits:',0dh,0ah,'$'string4 db 'number of others:',0dh,0ah,'$'letters db 0digit db 0others db 0.const;此处添加一些常量定义.code ;代码段开始.startup ;程序起始点,建立DS、SSlea dx,string1mov ah,09hint 21hmov cx,100w1:mov ah,01hint 21hcmp al,0dhjz over2cmp al,30hjb othercmp al,39hja higher1jmp digitalhigher1:cmp al,41hjb othercmp al,5Ahja higher2jmp letterhigher2:cmp al,61hjb othercmp al,7Ahja otherjmp letterjmp overother:inc othersjmp overletter:inc lettersjmp overdigital:inc digitjmp overjmp overover:noploop w1 over2:mov ah,02hmov dl,0Ahint 21hmov ah,02hmov dl,0dhint 21hlea dx,string2mov ah,09hint 21hxor ax,axmov al,lettersmov bl,10div blpush axmov dl,aladd dl,30h mov ah,02h int 21hpop axmov dl,ah add dl,30h mov ah,02h int 21hmov ah,02h mov dl,0Ah int 21hmov ah,02h mov dl,0dh int 21hlea dx,string3 mov ah,09h int 21hxor ax,ax mov al,digitmov bl,10 div blpush ax mov dl,al add dl,30h mov ah,02h int 21hpop axmov dl,ah add dl,30h mov ah,02h int 21hmov ah,02h mov dl,0Ah int 21hmov ah,02h mov dl,0dhint 21hlea dx,string4mov ah,09hint 21hxor ax,axmov al,othersmov bl,10div blpush axmov dl,aladd dl,30hmov ah,02hint 21hpop axmov dl,ahadd dl,30hmov ah,02hint 21hmov ah,4chint 21h.exit 0 ;程序结束点,返回DOS end。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编打字程序完整代码已经经过测试,可以直接使用Init_game macro op1,op2,op3,op4,op5local nsmov cx,00hmov dh,op1mov dl,op2ns:mov ah,02h;设置光标位置mov bh,00h;页号为0int 10hpush cxmov ah,0ah;在当前光标位置写字符mov al,op3;al=字符的ascii码mov bh,00h;bh=页号bl=字符属性mov cx,01h;cx=写入字符重复次数int 10hpop cx;cx=0inc cx;cx=cx+1inc op4cmp cx,op5jne nsendmclear_screen macro op1,op2,op3,op4 ;清屏宏定义cx,屏幕的左上角,dx屏幕的右下角mov ah,06hmov al,00hmov bh,0ah;改变行属性的色彩,字的色彩,bh空白行的属性/07就是正常的黑底白字mov ch,op1mov cl,op2mov dh,op3mov dl,op4int 10hmov ah,02h;设置光标的位置从0000开始mov bh,00hmov dh,00hmov dl,00hint 10hendmmenu macro op1,op2,op3 ;菜单显示宏定义mov ah,02hmov bh,00hmov dl,op2int 10hmov ah,09hlea dx,op3int 21hendmdata segmentZK db "WELCOME TO PLAY!$"no db "date:2014/4/7 BY luozhilei QQ:1121364692 $"meg db "press Enter to start.......$"meg1 db "when a letter is dropping,please hit it!(just press the$ " meg2 db "dropping letter,so easy!)$"meg3 db "press space key to pause!repress space to continue!$" meg4 db "press ESC key to return main menu!$"meg5 db "press letter 'E' to exit!$"meg6 db "version 1.0","$"speed dw 600dletters_bak db "jwmilzoeucgpravskntxhdyqfb"db "iytpkwnxlsvxrmofzhgaebudjq"db "nwimzoexrphysfqtvdcgljukda"letters db 78d dup(0)letter_counter db 0life_flag db 78 dup(0)position_flag db 78 dup(0)present_position db 1data endsstack segment para stack 'stack'db 64 dup(0)stack endscode segmentmain proc farassume cs:code,ds:data,ss:stackstart: mov ax,datamov ds,axmov letter_counter,00hmov present_position,1lea si,position_flag;mov ah,00hmov cx,00h------------------------------------lea di,letters;di的偏移地址为letterslea si,letters_bak;si的偏移地址为letter_bakmov cx,00h;cx=0mov ah,[si];ah=jmov [di],ah;ah的值放到letters里面;letters_bak的值放入letters里面inc si;si+1inc di;di+1inc cx;cx+1cmp cx,78d;jne init_letters;不为0就到init_letters,一直循环到letters里mov ah,00hlea si,life_flag;mov cx,00hover后,自动回去吧init_life_flag:mov [si],ahinc siinc cxcmp cx,78djne init_life_flag;-----------------------------------------------------------------------mov cx,00h ;ch=光标开始行,cl=光标结束行根据CX给出光标的大小mov ah,01hor ch,00010000b;ch>20h,光标消失,cl>20h,覆盖字符int 10hclear_screen 00d,00d,24d,79d ;清屏,0000- 2479Init_game 00d,00d,07h,dl,80d ;这个四个是初始化屏幕的上下左右的框框Init_game 24d,00d,07h,dl,80dInit_game 00d,00d,07h,dh,25dInit_game 00d,79d,07h,dh,25dmenu 05d,15d,ZK ;菜单信息的宏调用,这五行是在屏幕上显示提示消息menu 07h,15d,nomenu 09d,15d,megmenu 11d,15d,meg1menu 13d,10d,meg2menu 15d,15d,meg3menu 17d,15d,meg4menu 19d,15d,meg5menu 21d,15d,meg6put: mov ah,02h ;设置光标位置mov bh,00h;设置页码mov dh,22d;dx行列坐标mov dl,33dint 10hmov ah,01h ;从键盘输入任意字符并回显示,al=输入字符int 21hcmp al,0dh;是否为换行符je speed3;如果是换行符则跳转到speed3处cmp al,45h;比较是否为eje exit;如果为e,转到exitexit: mov ah,4chint 21hspeed3:mov ax,speed+12mov speed,axjmp beginbegin: clear_screen 01d,01d,23d,78d ;清屏宏调用; clear_screen 01d,01d,23d,78dInit_game 23d,01d,03h,dl,78d;23d01d行列坐标,初始化倒数第二行的字符mov ah,02hmov bh,00hmov dh,01hmov dl,01hint 10hmov cx,00hlea si,letters ;si的偏移地址是lettersnextletter:mov ah,02h ;显示字母mov dl,[si] ;把letters的字符放到dl里int 21h ;通过dos中断的2号功能项,把字符显示出来inc siinc cxcmp cx,78dje nextcycle;全部显示完了后,跳到nextcyclejmp nextletterfrom_front:sub present_position,78d ;当超过78个字时的处理方式减去78jmp gobackto_si;跑到gobackto_si这来find_zero:cmp letter_counter,78d ;letter_counter有78了,初始化je recycle;如果有跑到recyclecmp present_position,78d;如果present_position等于78d,je from_onemov ah,00hnextsi: add present_position,01hinc sicmp [si],ahje gobackto_dicmp present_position,78dje from_onejmp nextsifrom_one:mov present_position,01h ;present_position=01jmp gobackto_si;---------------------------------------------------------------------------------------recycle:mov letter_counter,00h;letter_counter=0mov present_position,01d;present_position=01lea si,position_flag;si=position_flag的偏移地址mov cx,00hmov ah,00hclearsi:mov [si],ah;position_flag地址搞成0inc cxcmp cx,78dje nextcycleinc sijmp clearsinextcycle:lea di,letters;di的偏移地址是letters[字母]lea si,position_flag;si的偏移地址是position_flagadd present_position,31d;31一跳,这个你可以随便设置cmp present_position,78d;;超过78个字节ja from_front;------------------------------------------------------------------------------------------------gobackto_si:add si,word ptr present_position;si=si+present_position,si向后偏移dec si; 要不要都无所谓,只不过,因为开始就觉定了是要31一跳,所以这里减一个1位mov ah,[si];把position_flag放到ah里cmp ah,01h;看看position_flag里面有没有标志1je find_zero;如果ah为1转移,否则gobackto_di:mov ah,01hmov [si],ahadd di,word ptr present_positiondec di;因为列坐标是从0开始,而字符是从1开始,所以这里是32-1mov dl,present_position;mov ah,02hmov bh,00hmov dh,01hint 10hmov cx,00h;------------------------------------------------------------------------------------------------------------------------nextrow: push cxmov cx,00hout_cycle: ; 延迟push cxmov cx,00hin_cycle:add cx,01hcmp cx,1000 ;jne in_cycle ;zf=0转到标号处执行,push dxmov ah,06h ;从键盘输入字符,al等于字符mov dl,0ffhint 21hpop dxjz passcmp al,1bh ;如果键入ESC,则返回主菜单je to_start1cmp al," " ;如果键入SPACE,则游戏暂停je pausecmp al,[di] ;输入字母正确!则字母消失je disappearpass: pop cxinc cxcmp cx,speedje printjmp out_cyclepause: push dx mov ah,06hmov dl,0ffhint 21hpop dxcmp al," "jne pausejmp passto_start1: ;返回主菜单jmp startprint:mov ah,0ah ;在当前光标位置写空格mov al," "mov bh,00hmov cx,01hint 10hinc dhmov ah,02h ;改变光标位置mov bh,00hmov ah,0ah ;在当前光标位置写字母mov al,[di]mov bh,00hmov cx,01hint 10hpop cxinc cxcmp cx,21dje print_next_letterjmp nextrow ;下一行disappear: ;击中字母后输出空格pop cxpop cxmov ah,0ah;在光标处按原来属性显示字符mov al," "mov bh,00hmov cx,01hint 10hjmp hitprint_next_letter:lea si,life_flagadd si,word ptr present_positiondec simov ah,0ah;在当前光标处按原有属性显示字符mov al," ";最倒数第二排写入字符,意思是当掉下来的字符到倒数第二行的时候,自动变成空格消失mov bh,00hmov cx,01hint 10hinc dh ;这就是到了最后一行mov ah,02hmov bh,00hint 10hmov ah,0ah;把最后一行的字符变成空格mov al," "mov bh,00hmov cx,01h;重复输出,这里的重复输出的意思就是输入一个空格int 10hmov ah,1;把life_flag变成1,这样下次就可以不在同一个位置掉字符下来mov [si],ahhit: mov ah,02h;设置光标mov bh,00hmov dh,01h;第一行mov dl,present_position;下一个字符的列mov al,[di] ; 出现下一个新字母的数法add al,7;di+7cmp al,7ah;z的ascii码就是7ah,所以当al大于7ah时转移ja convey_lettermov ah,0ah;在当前光标按原有属性显示字符,al=字符mov bh,00hmov cx,01hint 10hmov [di],aladd letter_counter,01h;统计次数jmp nextcycleconvey_letter:sub al,7ahadd al,61h;al等于要显示的字符,加61表示是小写字母mov ah,0ahmov bh,00hmov cx,01hint 10hmov [di],aladd letter_counter,01hjmp nextcycle ;没弄懂作者这里是什么意思,到了这里就jmp了那写下面的程序做屁clear_screen 01,01,23,78mov ah,02hmov bh,00hmov dh,11dmov dl,20dint 10hinc dhinc dhmov ah,02hmov bh,00hint 10hnotkey:mov ah,07hint 21hcmp al,0dhje to_startcmp al,1bhje overjmp notkeyto_start:clear_screen 00,00,24,79jmp startover: clear_screen 01,01,23,78 mov ah,02hmov bh,00hmov dh,11dmov dl,15hint 10hmov ah,02hmov bh,00hmov dh,13dmov dl,15hint 10hmov ah,07hint 21hmov ah,07hint 21hclear_screen 00,00,24,79 mov ax,4c00hint 21hmain endpcode endsend start。