×

25个经典汇编程序案例

25个经典汇编程序案例(求解个汇编语言的程序)

admin admin 发表于2024-06-29 01:15:30 浏览18 评论0

抢沙发发表评论

大家好,如果您还对25个经典汇编程序案例不太了解,没有关系,今天就由本站为大家分享25个经典汇编程序案例的知识,包括求解个汇编语言的程序的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

求解个汇编语言的程序

; This program find the maximum n such that 1+2+3+…+n is the maximum number can be stored in 32-bit register!.386.model flat, stdcall.stack 4096ExitProcess PROTO, dwExitCode:DWORDDumpRegs PROTO.codemain PROC mov eax, 0 mov ecx, 1start: mov edx,eax add eax, ecx jb var1 inc ecx jmp startvar1: call DumpRegs ;print all registers value INVOKE ExitProcess, 0main ENDPEND main//很有可能你不能运行这个程序,因为该程序需要调用了库一个函//数DumpRegs来打印当前寄存器状态信息,你可能没有库。不过没//有关系,你可以不调用这个函数,而用vc调试查看寄存器状态。//以上是保护模式程序,转换为16位实模式程序也很简单。//但是主体部分是不变的。即这一部分:// mov eax, 0// mov ecx, 1//start:// mov edx,eax // add eax, ecx// jb var1// inc ecx// jmp start//var1://你可以把它放在你的汇编环境中编译执行。程序执行结果如下: EAX=0000D937 EBX=7FFDD000 ECX=00016A0A EDX=FFFF6F2D ESI=01CAEC2A EDI=07A076FE EBP=0013FFF0 ESP=0013FFC4 EIP=00401028 EFL=00000213 CF=1 SF=0 ZF=0 OF=0 AF=1 PF=0请按任意键继续. . .//说明最后一个n为 ECX=00016A0A,而所得的1+2+3+…+n为EDX=FFFF6F2D。

汇编中断程序具体例子

我告诉你思路,例子就不举了,很简单:1、定义一个dword变量xxx用以存储原来的中断向量(所谓中断向量即中断发生时执行的子程序入口地址)2、编写自己的中断处理过程(yyy proc far),该处理过程内应保存所有可能修改的寄存器,并在返回前恢复原状;一般情况下,如果还需要执行原有中断处理过程,那么调用jmp far xxx链接到原来的中断过程;如果不需要执行原有过程,那么直接以iret返回即可3、在主程序开始时,先调用int 35h,获取指定中断号的中断向量,将返回的中断向量存储在xxx变量中4、调用int 25h,将指定的中断号的中断向量指向自己的过程yyy5、当前程序在退出前,应再次调用int 25h,将被修改掉的中断号的中断向量恢复为xxx变量的值

汇编程序

; 题目名称:输入成绩,分别升序、降序排序***隐藏网址***; 操作说明:成绩按百分制,输入成绩时,最多3位数,即100分;小于100分的成绩,按回车确认; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。Code Segment Assume CS:Code,DS:CodeCR equ 000DHLF equ 000AHKBBack equ 0008H; -------------------------------------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addr push ax lea dx,Str_Addr mov ah,9 int 21h pop ax EndM; -------------------------------------; 功能:在当前光标位置显示一个字符; 入口:dl=要显示的字符 Output_Chr proc Near push ax mov ah,2 int 21h pop ax ret Output_Chr Endp ; -------------------------------------; 功能:取光标位置; 入口:无; 出口:DH=行号,DL=列号GetCursor Proc Near PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX PUSH CS POP DS XOR BX,BX MOV AH,3 INT 10H MOV Cursor_Row,DH MOV Cursor_Col,DL POP DX POP CX POP BX POP AX POP DS RETCursor_Row DB ?Cursor_Col DB ?GetCursor EndP; -------------------------------------; 功能:置光标位置; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)SetCursor Proc Near PUSH DS PUSH DX PUSH CX PUSH BX PUSH AX PUSH CS POP DS MOV DH,Cursor_Row MOV DL,Cursor_Col XOR BX,BX MOV AH,2 INT 10H POP AX POP BX POP CX POP DX POP DS RETSetCursor EndP; -------------------------------------; 功能:键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。; 输足N位的,自动结束输入;不足N位的,空格结束输入。; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536; 约定:直接回车,视为数字0; 入口:cs:@@Digits=数字位数;es:di=保存输入的数字首地址; cs:@@Type_Data=保存的数据类型,B=字节类型,W=字类型。; 出口:转换后的二进制数保存在di所指的单元Input_Dec Proc Near push ds push dx push cx push bx push di push cs pop ds call GetCursor ;取光标位置 mov dx,WORD PTR Cursor_Row mov @@Tmp_Cursor,dx ;保存起始光标位置 lea di,@@Save_Tmp push di cld mov cl,@@Digits xor ch,ch push cx@@Input_Dec: call GetCursor ;取光标位置 mov ah,1 ;从键盘接受一个字符 int 21h cmp al,27 ;Esc? jz @@Return cmp al,CR ;若键入的是回车,已经键入的数字不足N位 jz @@ASC_Dec ;转去处理已经键入的数字 cmp al,KBBack jz @@KB_Back ;若是回空键,重新输入 cmp al,’0’ jb @@KBBack ;若低于数字’0’,重新输入 cmp al,’9’ ja @@KBBack ;若高于数字’9’,重新输入 jmp @@Save_Dig@@KB_Back: cmp cl,cs:@@Digits ;十进制数字位数 jz @@Input_Dec inc cx dec di dec Cursor_Col@@KBBack: call SetCursor ;置光标位置 jmp @@Input_Dec@@Save_Dig: and al,0fh ;转换成二进制数 stosb ;保存 loop @@Input_Dec ;接受下一个数字@@ASC_Dec: mov ax,cx pop cx pop si sub cx,ax ;实际输入的数字位数 xor bp,bp xor dx,dx xor ax,ax jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入’0’处理 dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数 jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数 mov bx,10@@Mul_Ten: lodsb xor ah,ah add ax,bp mul bx mov bp,ax loop @@Mul_Ten@@One_Digit: lodsb xor ah,ah add ax,bp@@Save_Ret: pop di cmp @@Type_Data,’B’ ;字节类型? jz $+5 stosw jmp $+3 stosb pop bx pop cx pop dx pop ds clc ret@@Return: pop cx pop di pop di pop bx pop cx pop dx pop ds stc ret@@Tmp_Cursor dw ? ;起始光标位置@@Digits db ? ;十进制数字位数@@Type_Data db ’B’ ;保存的数据类型。B=字节类型,W=字类型@@Save_Tmp db 7 dup(?)Input_Dec EndP; -------------------------------------; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示; 入口:AX=二进制数 ; 出口:在当前光标位置显示转换后的ASCII码数字 Unsi_Dec_ASCII Proc Near push dx push bx push di mov bx,10 lea di,@@Temp_Save mov BYTE PTR ,’$’ dec di cld @@Divide: xor dx,dx div bx or dl,30h mov ,dl dec di test ax,ax jnz @@Divide inc di push di pop dx mov ah,9 int 21h pop di pop bx pop dx ret @@Temp_Save db 6 dup(?)Unsi_Dec_ASCII EndP; -------------------------------------Input_Score proc Near mov @@Digits,3 ;十进制数字位数 mov @@Type_Data,’B’ ;保存的数据类型。B=字节类型,W=字类型 lea di,Buffer ;成绩保存地址 Output Prompt_Str ;提示输入成绩@@Input_Scores:call Input_Dec ;键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元 pushf inc Cursor_Col call Setcursor mov dl,20h call Output_Chr ;显示一个空格 popf jnc @@Input_Scores mov cx,di sub cx,offset Buffer ;成绩个数 mov Counter,cx ;保存 retInput_Score Endp; -------------------------------------Increase_Sort proc Near mov BYTE ptr @@Compare,76h jmp @@SortingIncrease_Sort Endp; -------------------------------------Decrease_Sort proc Near mov BYTE ptr @@Compare,73h@@Sorting: lea si,Buffer mov cx,Counter ;成绩个数 dec cx ;外循环次数 cld@@Scanning: push cx ;入栈保存外循环次数 push si ;入栈保存数组地址@@Compare: mov di,si ;当前数组元素地址赋给目的变址寄存器,以备交换之用 lodsb ;将当前数组元素读入累加器 cmp al, ;当前数组元素与相邻的下一个数组元素相比较 jae @@NextOne ;若大于或等于,不作数据交换,处理下一个数组元素 xchg al, ;若小于,交换数组元素 stosb ;保存数值较小者@@NextOne: loop @@Compare ;处理下一个数组元素 pop si ;数组地址出栈 pop cx ;外循环次数出栈 loop @@Scanning ;下一趟比较 mov WORD ptr Cursor_Row,12 call SetCursor ;置光标位置 lea si,Buffer mov cx,Counter ;成绩个数@@List_Scores: lodsb xor ah,ah call Unsi_Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示 mov dl,20h call Output_Chr ;显示一个空格 loop @@List_Scores retDecrease_Sort Endp; -------------------------------------Prompt_Menu db 35 dup(20h),’Main Menu’,13,10 db 30 dup(20h),201,18 dup(205),187,13,10 db 30 dup(20h),186,’ 1. input scores ’,186,13,10 db 30 dup(20h),186,’ 2. increase sort ’,186,13,10 db 30 dup(20h),186,’ 3. decrease sort ’,186,13,10 db 30 dup(20h),186,’ 0. Return to DOS ’,186,13,10 db 30 dup(20h),200,18 dup(205),188,13,10 db 32 dup(20h),’Choice(0-3):$’Cursor_Tmp dw ?Counter dw ? ;成绩个数Proc_Addr dw Input_Score,Increase_Sort,Decrease_SortPrompt_Str db 13,10,10,’Please input scores:’,13,10,’$’Press_Key db 7,13,12 dup(10),’The complated. Press any key to exit...$’ Start: push cs pop ds ;使数据段与代码段同段 mov ax,3 ;设置25*80字符显示方式 int 10h Output Prompt_Menu ;显示主菜单 xor bx,bx mov ah,3 int 10h mov Cursor_Tmp,dx mov ax,0b800h mov es,ax ;设置字符显示方式缓冲区段地址 mov di,35*2+1 mov al,13 ;LightMagenta mov cx,10 cldAttribute: stosb inc di loop Attribute mov di,160*2+32*2+1 stosb add di,159 stosb add di,159 stosb add di,159 stosb mov di,160*7+39*2+1 stosb inc di stosb inc di stosb push cs pop es ;使附加段与代码段同段Choice_Func: mov dx,Cursor_Tmp xor bx,bx mov ah,2 int 10h mov ah,1 int 21h cmp al,’0’ jz Exit_Proc cmp al,’1’ jb Choice_Func cmp al,’3’ ja Choice_Func and ax,0fh mov bx,ax dec bx shl bx,1 call Proc_Addr jmp Choice_Func; -------------------------------------Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序 mov ah,1 int 21h mov ah,4ch ;结束程序 int 21hBuffer db ? ;数据缓冲区Code ENDS END Start ;编译到此结束

高分求解:几个简单的汇编程序编程

1. mov bx, ax2. mov dx, 3ffh3. mov bx, ds:4. MOV BYTE PTR , BH5. MOV , 90H6. 没看懂,向前 还是向后,我写了一个 方向递增,你自己看看需不需要改 .MODEL SMALL .486 .CODEBEGIN: MOV AX, 1000H MOV DS, AX MOV CX, 100NMOV: MOV BX, 100 MOV AX, MOV ,AX INC BX LOOP NMOV MOV AH, 4C INT 21HEND BEGIN7. (MASM611 编译).MODE SMALL.486.DATA.CODEBEGIN: MOV AX, 2000H MOV DS, AX MOV AL, BYTE PTR XOR CX, CX MOV CL, AL MOV DX, 0 ;OFFSET OF 2000H MOV BX, 1000H ;3000H VALUE CLC ;CLEAR CFXADD: MOV AX, 0 JNB XNEXT ADD AL, 1XNEXT: MOV AL, BYTE PTE ; TRANSFER THE VALUE TO AX ADD BYTE PTR DS:, AL INC BX INC DXLOOP XADD MOV AH, 4C INT 21HEND BEGIN8..MODE SMALL.486.DATA.CODEBEGIN: LEA BX, BUF MOV CX, 100 SER: MOV AL, BYTE PTR CMP AL, ’A’ JNZ NNEXT MOV BYTE PTR , ’B’NNEXT: INC BX LOOP SER NEXIT: MOV AH, 4C INT 21HEND BEGIN9.XOR AX, AXMOV AX, PACREDXOR DX, DXMOV DL, ALMOV WORD PTR UNPACKED, BXLEA BX, UNPACKEDXOR DX, DXMOV DL, AHMOV WORD PTR , BX10.这个书上抄就好了没有修改过,你自己检查一下吧,不好意思啦

求一个单片程序(汇编程序)

;共阴数码管,段接P2口;;控制按键按P0.0,低电平有效。ORG 0000HSTART:MOV R0,#00HMOV DPTR,#TABLOOP:MOV A,R0MOVC A,@A+DPTRCPL AMOV P2,AACALL DELAYJB P0.0,NUM_INCDEC R0MOV A,R0ANL A,#0FHCJNE A,#0FH,LOOP1MOV A,#09HLOOP1:MOV R0,ASJMP LOOPNUM_INC:INC R0MOV A,R0ANL A,#0FHCJNE A,#0AH,LOOP2MOV A,#00HLOOP2:MOV R0,ASJMP LOOPDELAY:MOV R6,#00hDELAY1:MOV R7,#00HDELAY2:NOPNOPDJNZ R7,DELAY2DJNZ R6,DELAY1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90h,88H,83H,0C6H,0A1H,86h,8EHEND

以上就是我们为大家找到的有关“25个经典汇编程序案例(求解个汇编语言的程序)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。