首页技术汇编程序设计(汇编语言有多难)

汇编程序设计(汇编语言有多难)

编程之家2026-06-29888次浏览

大家好,汇编程序设计相信很多的网友都不是很明白,包括汇编语言有多难也是一样,不过没有关系,接下来就来为大家分享关于汇编程序设计和汇编语言有多难的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

汇编程序设计(汇编语言有多难)

汇编语言程序设计的一般步骤是什么

汇编语言程序设计的基本步骤了解了汇编语言指令的功能和用法,了解了汇编语言程序的编写格式,就可以编制完整的汇编语言程序了。一个程序通常具有顺序、分支、循环和子程序4种结构形式。顺序程序结构就是指完全按顺序逐条执行的指令序列。在程序设计过程中,顺序结构大量存在,屡见不鲜。但一个完整的程序只是逐条去执行指令,这非常少见。常见的程序结构,是上述4种结构的混合体。一般来说,编制一个汇编语言程序的步骤如下:(1)分析题意,确定算法或算法思想。算法是指解决问题的方法和步骤。比如现有的一些计算方法和日常生活中解决问题的逻辑思维推理方法等。(2)根据算法画出流程图,简单的情况也可不画。画出描述算法的流程图,可以首先从图上检验算法的正确性,减少出错的可能,使得动手编写程序时的思路更加清晰。(3)分配存储空间和工作单元,合理地使用寄存器。分配存储空间和工作单元,是指存储空间的分段和数据定义。另外,由于寄存器的数量有限,编写程序时经常会感到寄存器不够用。因此,对于字节数据,要尽量使用8位寄存器。而采用适当的寻址方式,也会达到节省寄存器的目的。(4)根据流程图编写程序。这是编制汇编语言程序最为重要的一步。算法里规定的功能,是要通过一条条指令描述出来的。为了提高编程能力,对于初学者,一是要多阅读现有的程序,以学习别人的编程经验;而更为重要的是,必须多亲自动手编写,不要怕失败,只有通过无数次失败,才能从中积累自己的编程经验。(5)上机调试运行程序。通过汇编的源程序,只能说明它里面不存在语法错误。但是它是否能达到算法所要求的预期效果,还必须经过上机调试,用一些实验数据来测试,才能够真正地得出结论。可以这么说,即使是一个非常有经验的程序员,也没有百分之百的把握说他编写的程序一次就成功。用流程图表示算法流程图用一些图形框来代表各种操作。用图形表示算法,直观形象,可以用来帮助人们对算法的理解。下图给出了一些常用的流程图符号。

上图中的判断框(菱形)用来对一个给定的条件作出判断,以决定如何执行其后的操作。它有一个入口,两个出口,如下图(a)所示。

连接点(圆圈)是用来将画在不同地方的流程线连接起来。例如在下图(b)里,有两个圈里写着数字1的圆圈,它表示是从左边的1出来,进到右边图的1里(这由流程线的方向给出)。可以看出,这两个点其实就是同一个点,只是由于画不下而分开来画的。用连接点,可以避免流程图中的流程线相互交叉或过长,从而使流程图清晰。

注释框不是流程图中必需的部分。在流程图中使用它,是为了对流程图中的某些框的操作做一些必要的说明,以便使人们能够更好地通过流程图来理解算法。

处理框反映做些什么样的操作,如把某个单元的内容送入某个寄存器,从某个存储单元取出数据等。它是流程图里最为本质的、出现最多的图形框。

输入/输出框反映程序的输入和输出情况。计算机程序无外乎接收数据,进行处理,然后加以输出,所以输入/输出框是必不可少的。

汇编程序设计(汇编语言有多难)

汇编语言程序设计

;本程序通过编译,运行正确

Code Segment

Assume CS:Code,DS:Code

;-----------------------------------------

;功能:显示指定地址(Str_Addr)的字符串

;入口:

汇编程序设计(汇编语言有多难)

; Str_Addr=字符串地址(要求在数据段)

;用法: Output Str_Addr

;用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

;-----------------------------------------

;功能:输出回车换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

;-----------------------------------------

;功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

;入口:AX=二进制数

;出口:在当前光标位置显示转换后的ASCII码数字

Dec_ASCII Proc Near

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[6]

mov byte ptr [di],'$'

dec di

cld

@@Divide: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,0ffffh

jnz@@Divide

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

ret

@@Temp_Save db 7 dup(?)

Dec_ASCII EndP

;-----------------------------------------

;功能:在N个字节数组中查找字符CHAR,并记录该字符出现的次数。

;入口参数:

; si=一个N字节数的字符串TABLE首地址

; cx=字符串长度,N

; ah=要查找的字符

;出口参数:bl=该字符出现的次数

Find_Chr Proc Near

@@Find_Chr: lodsb

cmp al,ah;是指定的字符?

jnz$+4;不是

inc bl;是,计数

loop Find_Chr;判断下一个字符

ret

Find_Chr EndP

;-----------------------------------------

Prompt_Str db'Please input a string:$';输入字符串提示信息

No_String db'The string is null.$';空字符串提示信息

Prompt_Chr db'Please input a charactor:$';输入字符提示信息

Prompt_CNT db'The specified charactor in th string TABLE:$';指定字符出现次数提示信息

Start: push cs

pop ds

push cs

pop es;使数据段、附加段与代码段同段

cld

Input_Str: Output Prompt_Str;提示输入字符串

lea dx,TABLE;字符串缓冲区地址

mov ah,0ah

int 21h

call Output_CTLF;输出一个回车、换行

lea si,TABLE[1];实际输入的字符串长度地址

lodsb;读入这个长度N

test al,0ffh;N=0?

jnz Read_Chr;否,转去输入一个字符

Output No_String;空字符串提示信息

jmp Input_Str;重新输入字符串

Read_Chr: Output Prompt_Chr;提示输入字符

mov ah,1;从键盘输入一个字符

int 21h

cmp al,1bh

jz Exit_Proc;若按键为Esc,则结束程序

cmp al,20h;控制及通讯字符?

jb Read_Chr;重新输入字符

call Output_CTLF;输出一个回车、换行

call Output_CTLF;输出一个回车、换行

push ax

Output Prompt_CNT;提示指定字符出现次数提示

pop ax

mov ah,al;指定的字符送ah保存

lea si,TABLE[1];实际输入的字符串长度地址

lodsb;读入这个长度N

mov cl,al

xor ch,ch;N=cx

xor bl,bl;计数器,计数指定字符在字符串中出现的次数

call Find_Chr;在N个字节数组中查找字符CHAR,并记录该字符出现的次数

mov al,bl

xor ah,ah

call Dec_ASCII;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

Exit_Proc: mov ah,4ch;结束程序

int 21h

TABLE db 255;字符串缓冲区

Code ENDS

END Start;编译到此结束

汇编语言程序设计题

;本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。虽不敢说万无一失,但自信无虞;请楼主严格测试,若还有误,本回答作废。

;题目名称:键盘输入两个10位数以内(位数可变)十六进制数,求和并显示输出

;题目来源:

;操作说明:输入两个10位数以内(位数可变)十六进制数时,输足10位,自动结束输入;不足10位,按回车键结束输入。

Code Segment

Assume CS:Code,DS:Code

CR equ 000DH

LF equ 000AH

KBBack equ 0008H

;-------------------------------------

;功能:显示指定地址(Str_Addr)的字符串

;入口:

; Str_Addr=字符串地址(要求在数据段)

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

;-------------------------------------

;功能:在当前光标位置显示一个字符

;入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr Endp

;-------------------------------------

;功能:显示、输出一个回车、换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF 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

RET

Cursor_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

RET

SetCursor EndP

;-------------------------------------

;功能:键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元

;输足N位的,自动结束输入;不足N位的,回车结束输入。

;入口:@@Hexadec=数字位数,ds:di=输入数据保存地址

;出口:保存在指定的存储单元

Input_Hex Proc Near

push es

push di

push cx

push ax

push ds

pop es

mov cx,cs:@@Hexadec;十六进制数位数

cld

push cx

xor al,al

rep stosb;数据缓冲区清零

pop cx

dec di

@@Input_Hex: call GetCursor;取光标位置

mov ah,1;从键盘接受一个字符

int 21h

cmp al,CR;回车?已经键入的十六进制字符不足N位

jz@@Return_Hex

cmp al,KBBack;回空键?

jz@@KB_Back;是,重新输入

cmp al,'0';低于数字'0'?

jb@@KBBack;是,重新输入

cmp al,'9';低于或等于数字'9'?

jbe@@Convert_Bin;是,转去转换成二进制数

and al,0dfh;对高于数字'9'的字符视为字母并转换成大写,以便判断是否是A~F之间的字母

cmp al,'A';低于字母'A'?

jb@@KBBack;是,重新输入

cmp al,'F';高于字母'F'?

ja@@KBBack;高于字母'F',重新输入

sub al,7;使低4位等于对应字母的十六进制值

@@Convert_Bin: and al,0fh;转换成二进制数

push ax;入栈保存

loop@@Input_Hex;接受下一个数字

@@Return_Hex: mov ax,cx

mov cx,cs:@@Hexadec

sub cx,ax

jcxz@@Return_pop

std

@Reverse_Order:pop ax

stosb;保存

loop@Reverse_Order

@@Return_pop: pop ax

pop cx

pop di

pop es

ret

@@KB_Back: cmp cx,cs:@@Hexadec;十六进制数位数

jz@@Input_Hex

inc cx

dec di

dec Cursor_Col

@@KBBack: call SetCursor;置光标位置

jmp@@Input_Hex

@@Hexadec dw?;数字位数

Input_Hex EndP

;-------------------------------------

;功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码

;入口:AL

;出口:AL=转换后的ASCII码

AL_ASCII Proc Near

cmp al,10;AL<10?

jb@@To_ASCII;AL<10,按数字处理

add al,7;AL>=10,按大写字母处理

@@To_ASCII: add al,'0';转换成相应的数字或大写字母

ret

AL_ASCII EndP

;-------------------------------------

;功能:键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回

;入口:无

;出口:若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。

Yes_or_No proc Near

push dx

push ax

@@Input_Chr: mov ah,7;不带回显的键盘输入

int 21h

mov dl,al

and al,0dfh

cmp al,'Y'

jnz$+5

stc

jmp$+7

cmp al,'N'

jnz@@Input_Chr

clc

mov ah,2

int 21h

pop ax

pop dx

ret

Yes_or_No Endp

;-------------------------------------

N equ 10;数据位数

Summand db N dup(?);被加数

Addend db N dup(?);加数

Sum db N+1 dup(?);和

Prompt_Str1 db'Please input the summand:$';“输入被加数”提示信息

Prompt_Str2 db 13,10,'Please input the addend:$';“输入加数”提示信息

Prompt_Str3 db 13,10,'The sum:$';“显示相加之和”提示信息

Prompt_Str4 db 13,10,13,10,'Do you want to continue(y/n)?$';“继续做加法?”提示信息

Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'

;-------------------------------------

Start: push cs

pop ds

push cs

pop es

mov@@Hexadec,10;数字位数

Addition_Hex: lea di,Sum;相加和存放地址

mov cx,N+1

xor al,al

cld

rep stosb;相加之和初始值清零

Output Prompt_Str1;提示输入被加数

lea di,Summand;被加数存放地址

call Input_Hex;键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元

Output Prompt_Str2;提示输入加数

lea di,Addend;加数存放地址

call Input_Hex

mov si,9;个位数下标

lea di,Sum[10];相加之和个位数存放地址

mov cx,10;数据位数

std

clc;进位标志位复位

Addition: mov al,Summand[si];读入一位被加数

adc al,Addend[si];加上加数

push cx

xor ah,ah

mov cx,4

shl ax,cl;左移4位,把进位标志位移到AH

shr al,cl;右移4位,把AL的低4位移回

pop cx

stosb;保存相加结果

rcr ah,1;带进位循环右移1位,把进位结果移至标志位

dec si

loop Addition

mov al,ah

rcl al,1;把进位标志移入AL

test al,al

jz$+3

stosb;保存最高位进位

Output Prompt_Str3;提示显示相加和

mov cx,N+1

lea di,Sum;相加和存放地址

xor al,al

cld

repz scasb;扫描相加和最高有效位

dec di

inc cx

mov si,di;相加和最高有效位地址

@@Output_Data: lodsb;读入1位相加和结果

call AL_ASCII;将AL中的低4位二进制数转换成十六进制显示的ASCII码

mov dl,al

call Output_Chr;显示一个字符

loop@@Output_Data

Output Prompt_Str4;提示是否继续做十六进制加法

call Yes_or_No;键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回

call Output_CTLF;显示、输出一个回车、换行

call Output_CTLF

jc Addition_Hex

;-------------------------------------

Exit_Proc: Output Press_Key;提示操作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch;结束程序

int 21h

Code ENDS

END Start;编译到此结束

关于汇编程序设计和汇编语言有多难的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

float属性(float默认保留几位小数)php编译软件?php代码编译