汇编语言程序设计
❶ 汇编语言程序设计
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
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 AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数的十六进制数字,将其转换成二进制数
; 由于限定最大数据类型为字,所以,十六进制数字位数最多4位,最大无符号数:0FFFFH
; 约定:直接回车,视为数字0
; 入口:@@Hexadec=数字位数
; 出口:转换后的二进制数保存在AX寄存器中
Input_Hex Proc Near
push cx
push bx
mov cx,cs:@@Hexadec ;十六进制数位数
xor bx,bx ;十六进制数初值
@@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'?
jbe @@Convert_Bin ;是,转去转换成二进制数
jmp @@KBBack ;高于字母'F',重新输入
@@KB_Back: dec Cursor_Col
inc cx
@@KBBack: call SetCursor ;置光标位置
jmp @@Input_Hex
@@Convert_Bin: and al,0fh ;转换成二进制数
push cx
mov cx,4
shl bx,cl ;前面的数左移4位,实现乘16
or bl,al ;加上刚输入的数
pop cx
loop @@Input_Hex ;接受下一个数字
@@Return_Hex: mov ax,bx
pop bx
pop cx
ret
@@Hexadec dw ? ;数字位数
Input_Hex EndP
; -------------------------------------
Hex_Number dw 3 p(?) ;
Prompt_Hex db 'Please input 4 bits hexadecimal number: $'
Temp_Cursor dw ? ;保存光标位置
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
Output Prompt_Hex ;提示输入4位十六进制数
lea di,Hex_Number ;十六进制数存放地址
mov cs:@@Hexadec,4 ;十六进制数位数
mov cx,3
cld
Input_Data: call GetCursor ;取光标位置
mov ax,WORD PTR Cursor_Row
mov Temp_Cursor,ax ;保存光标位置
call Input_Hex ;键盘输入一个指定位数的十六进制数字,将其转换成二进制数
stosw ;保存
cmp cx,1 ;最后一个数?
jz @@Continue ;是,跳过显示逗号
mov ax,Temp_Cursor ;取光标位置
add ah,4 ;列号加4
mov WORD PTR Cursor_Row,ax
call SetCursor ;置光标位置
mov dl,','
call Output_Chr ;显示一个字符
@@Continue: loop Input_Data ;下一个十六进制数
call Output_CTLF ;输出一个回车、换行
mov ax,Hex_Number ;读入第一个数
mov dl,'0' ;假设三个数都不相等
cmp ax,Hex_Number[2] ;等于第二个数?
jnz Next_One ;不等,转去判断是否等于第三个数
inc dl ;相等,增值
mov ax,Hex_Number[2] ;读入第二个数
Next_One: cmp ax,Hex_Number[4] ;等于第三个数?
jnz $+4 ;不等,显示字符
inc dl ;相等,增值
call Output_Chr ;显示一个字符
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
❷ 汇编语言程序设计步骤 有那几步
汇编语言程序设计步骤: 1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分数已存入计算机内存。 1、 分析问题 根据条件、特点、规律 →数学模型 本例分数已给定为0~200之间的整数集合(考虑加试分) ,记为{S},找max{S}(注: 简单问题不一定写数学模型) 。 2、 确定算法思想 最好利用现成算法和程序设计方法,若无,则需根据实践经验总结算法思想。如本例, 从成绩单第一分数往下看,边看边比较,记住较高分,舍弃较低分,直至看完,最高分存于 脑中。归纳算法思想:建立数据指针并指向数据区首地址。将第一数取入寄存器(如AL) , 与下一数比较,若下一数大则将其取入寄存器,否则调整指针,再与下一数比较,重复上述 过程,直至比较完毕,寄存器中即最高分。 读分数用MOV指令,比较用CMP指令,分析判断用条件转移指令。 3、 画流程图或结构图 有逻辑流程、算法流程、程序流程等,复杂问题需画模块结构。本例简单,只画出程序 流程图(用模块化结构的N-S流程图表示) : 本例的N-S流程图 图中初始化包括:设一个计数器,将分数个数减一后送计数器,每比较一次减一,至 零查找结束;建立一个指针指向数据区。 开始 初始化 取第一数到寄存器 与下一数比较 下一数大? 是 否 取大数到寄存器 修改指针,计数次数减一 返回到循环体开始,直到计数次数为0退出循环 结束 4、 分配存储器空间和工作单元(寄存器) 定义数据段、堆栈段、代码段等。工作单元一般用寄存器。本例:分数放数据段,建100 字节堆栈空间,BX作数据指针,CX作计数器,AL放最高分。 5、 逐条编写程序 DATA SEGMENT FEN DB 85,90,60,75,87,35,80,78,96,82…… ;存分数 MAX DB ? ;存最高分 DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 100 DUP(?) ;100字节堆栈 STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR PUSH DS MOV AX,0 PUSH AX ;为了返回DOS MOV AX,DATA MOV DS,AX ;置数据段寄存器 MOV BX,OFFSET FEN ;置数据指针 MOV CX,MAX-FEN ;置计数器初值 DEC CX ;N个分数比较N-1次 MOV AL,[BX] ;取第一个分数 LOP: INC BX ;调整指针 CMP AL,[BX] ;与下一数比较 JAE NEXT ;大于等于则转 MOV AL,[BX] ;否则取下一数 NEXT: LOOP LOP ;计数器减一, ;不为零转LOP MOV MAX,AL ;存放最高分 RET ;返回DOS START ENDP CODE ENDS END START 6、 静态检查,上机调试 选用指令尽量字节少,使其执行速度快。易错处应重点查,如比较次数、转移条件等。 确信无错后方可上机调试。
❸ 汇编语言程序设计的内容简介
本书根据IEEE/ACM推出的CC2005和我国教育部高等学校计算机科学与技术教学指导委员会2006年发布的《高等学校计算机科学与技术专业发展战略研究报告暨专业规范(试行)》编写而成,内容涵盖了知识领域CSAR3汇编级机器组织的知识点。
本书以Intel 80x86指令系统和汇编语言开发工具MASM 6.11与MASM 32为主体,在PC的MS-DOS和Windows环境中,较为系统地介绍了汇编语言程序设计所需要的指令、语法以及调试工具。第1~5章是80x86汇编语言的基本内容,包括汇编语言基础知识、寻址方式、主要汇编指令、伪指令、源程序格式、分支结构程序、循环结构程序、子程序和宏的程序设计技巧;第6~8章介绍了输入/输出程序的设计,包括输入/输出的基本概念,查询方式的I/O程序设计,中断处理程序设计,键盘、鼠标和视频的操作,磁盘文件存取的相关程序设计;第9~10章将内容扩展到32位汇编语言、多媒体指令和浮点编程等应用方面以及Windows窗口应用程序的开发。
本书适合作为高等院校计算机科学与技术及相关专业的教材,也可作为相关专业工程技术人员的参考书。
❹ 汇编语言程序设计的一般步骤是什么
一、 上机实验步骤注:以下步骤适用于除汇编语言程序设计的实验一到实验四外的所有实验(实验一到实验四仅使用TD.EXE)。1.确定源程序的存放目录建议源程序存放的目录名为ASM(或MASM),并放在C盘或D盘的根目录下。如果没有创建过此目录,请用如下方法创建:通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中点击右键,在弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。请把MASM.EXE、LINK.EXE、DENUG.EXE和TD.EXE都拷贝到此目录中。2.建立ASM源程序建立ASM源程序可以使用EDIT或NOTEPAD(记事本)文本编辑器。下面的例子说明了用EDIT文本编辑器来建立ASM源程序的步骤(假定要建立的源程序名为HELLO.ASM),用NOTEPAD(记事本)建立ASM源程序的步骤与此类似。在Windows中点击桌面左下角的“开始”按钮→选择“运行”→在弹出的窗口中输入“EDIT.COM C:\ASM\HELLO.ASM”,屏幕上出现EDIT的编辑窗口窗口标题行显示了EDIT程序的完整路径名。紧接着标题行下面的是菜单行,窗口最下面一行是提示行。菜单可以用Alt键激活,然后用方向键选择菜单项,也可以直接用Alt-F打开File文件菜单,用Alt-E打开Edit编辑菜单,等等。如果键入EDIT命令时已带上了源程序文件名(C:\ASM\HELLO.ASM),在编辑窗口上部就会显示该文件名。如果在键入EDIT命令时未给出源程序文件名,则编辑窗口上会显示“UNTITLED1”,表示文件还没有名字,在这种情况下保存源程序文件时,EDIT会提示输入要保存的源程序的文件名。编辑窗口用于输入源程序。EDIT是一个全屏幕编辑程序,故可以使用方向键把光标定位到编辑窗口中的任何一个位置上。EDIT中的编辑键和功能键符合Windows的标准,这里不再赘述。源程序输入完毕后,用Alt-F打开File菜单,用其中的Save功能将文件存盘。如果在键入EDIT命令时未给出源程序文件名,则这时会弹出一个“Save as”窗口,在这个窗口中输入你想要保存的源程序的路径和文件名(本例中为C:\ASM\HELLO.ASM)。 注意,汇编语言源程序文件的扩展名最好起名为.ASM,这样能给后面的汇编和连接操作带来很大的方便。3.用MASM.EXE汇编源程序产生OBJ目标文件源文件HELLO.ASM建立后,要使用汇编程序对源程序文件汇编,汇编后产生二进制的目标文件(.OBJ文件)。具体操作如下: 方法一:在Windows中操作用资源管理器打开源程序目录C:\ASM,把HELLO.ASM拖到MASM.EXE程序图标上。 方法二:在DOS命令提示符窗口中操作选择“开始”→“程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入MASM命令:I:>C:<回车> C:>CD \ASM<回车>C:\ASM>MASM HELLO.ASM<回车> 不管用以上二个方法中的哪个方法,进入MASM程序后,都会提示让你输入目标文件名(Object filename),并在方括号中显示默认的目标文件名,建议输入目标文件的完整路径名,如:C:\ASM\HELLO.OBJ〈回车〉。后面的两个提示为可选项,直接按回车。注意,若打开MASM程序时未给出源程序名,则MASM程序会首先提示让你输入源程序文件名(Source filename),此时输入源程序文件名HELLO.ASM并回车,然后进行的操作与上面完全相同。如果没有错误,MASM就会在当前目录下建立一个HELLO.OBJ文件(名字与源文件名相同,只是扩展名不同)。如果源文件有错误,MASM会指出错误的行号和错误的原因。4.用LINK.EXE产生EXE可执行文件在上一步骤中,汇编程序产生的是二进制目标文件(OBJ文件),并不是可执行文件,要想使我们编制的程序能够运行,还必须用连接程序(LINK.EXE)把OBJ文件转换为可执行的EXE文件。具体操作如下: 方法一:在Windows中操作用资源管理器打开源程序目录C:\ASM,把HELLO.OBJ拖到LINK.EXE程序图标上。 方法二:在DOS命令提示符窗口中操作选择“开始”→“程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入LINK命令:I:>C:<回车> C:>CD \ASM<回车>C:\ASM>LINK HELLO.OBJ<回车>不管用以上二个方法中的哪个方法,进入LINK程序后,都会提示让你输入可执行文件名(Run file),并在方括号中显示默认的可执行文件名,建议输入可执行文件的完整路径名,如:C:\ASM\HELLO.EXE〈回车〉。后面的两个提示为可选项,直接按回车。注意,若打开LINK程序时未给出OBJ文件名,则LINK程序会首先提示让你输入OBJ文件名(Object Moles),此时输入OBJ文件名HELLO.OBJ并回车,然后进行的操作与上面完全相同。如果没有错误,LINK就会建立一个HELLO.EXE文件。如果OBJ文件有错误,LINK会指出错误的原因。对于无堆栈警告(Warning:NO STACK segment)信息,可以不予理睬,它不影响程序的执行。如链接时有其它错误。须检查修改源程序,重新汇编、连接,直到正确。5.执行程序建立了HELLO.EXE文件后,就可以直接在DOS下运行此程序,如下所示:C:>HELLO〈回车〉C:>程序运行结束后,返回DOS。如果运行结果正确,那么程序运行结束时结果会直接显示在屏幕上。如果程序不显示结果,我们如何知道程序是否正确呢?例如,这里的HELLO.EXE程序并未显示出结果,所以我们不知道程序执行的结果是否正确。这时,我们就要使用TD.EXE调试工具来查看运行结果。此外,大部分程序必须经过调试阶段才能纠正程序执行中的错误,调试程序时也要使用TD.EXE。
❺ 汇编语言程序设计程序结构可分为哪四种
1.顺序程序结构
2.分支或选择程序结构
3.循环程序结构
4.子程序
❻ 汇编语言程序设计的特点
●认识领先。《汇编语言程序设计》根据人的认识规律实践-理论-实践的特点组织教学内容,在全书开始及各重要章节开始,都以完整的实例引导,学生通过实例能感性地了解到需要学习的内容以及意义,比纯概念式的灌输能产生更好的教学效果。
●准确定位。《汇编语言程序设计》强调为应用类读者服务,力求门槛低、内容全、描写细腻,与“应用类”读者群的需求相适应。选择从具有代表性、汇编难度适中的8086/8088入手,重点关注汇编语言程序设计方法,为学生进一步掌握计算机控制技术、学习计算机接口和单片机等课程打好基础。
●精选用例。《汇编语言程序设计》在设计用例时,突出主要知识点及应用中的关键问题,尽量减少代码量并给出详细注释,让程序结构与设计思想一目了然。
●加强输入/输出程序设计的教学。《汇编语言程序设计》加入了对外设操作常用芯片的介绍,着重讨论外部连接、工作方式及其设定,学习相关程序设计方法,突出软件方面内容。对于这一部分,教师可以根据实际情况灵活处理,即使之后开设接口课,多数会基于C语言教学,《汇编语言程序设计》介绍的输入输出内容也是有益的衔接。
●配套实验指导。随《汇编语言程序设计》出版,我们将在出版社网站上同时发布相应的实验指导材料,采用认识-模仿-组装-创新的结构组织实验内容。在每次实验前,教师可以向学生下发当次实验的电子文档,学生上机时,有些内容只需要复制、粘贴就可以进入实质性的实验,突出汇编语言程序算法与设计方法的学习,避免将大量的时间用到文字输入与审校中。为了让学生充分思考问题,又设计了一些带创新性的问题,包括程序组装与程序设计题,引导学生不断深入。
❼ Intel汇编语言程序设计 和 王爽的汇编语言 那本比较好
话说怎么这么来巧,这三自本我都看过。。。
王爽的简单,容易明白,容易入门,没法精通。
Intel汇编语言,内容详细,缺点就是太厚了,你可以和王爽的比下,快3本了。
所以他写的比较全面。
windows32,这个我曾经是作为后续才看到,因为它是WIN32汇编,不是X8086汇编了,
他使用的是WINDOWS界面编程。win32汇编和8086汇编类似于MFC和C的的关系一样。
调用的都是API,就不是单纯的MOV ADD JMP了。
需要学习WIN32汇编,最好是在8086汇编的基础上去学习,就像是从简单的学起,。
下面是我的建议:
如果你只想了解,开拓视野。建议去学王爽的,简单,容易理解,加个汇编交流群,网络一个小甲鱼汇编视频,一半个月就自学会了。
如果你想玩黑客,破解。。。那最好去学习,intel的。如果你连这都看不明白,那么想深入的搞清楚汇编语言,一个字,难。
如果你是学计算机的,想在windows下进行编程,并且想最个有界面的,可以先学,王爽,然后学习win32.
❽ 简述用汇编语言进行程序设计的步骤。
汇编语言程序设计步骤:
(1)分析问题:已知条件、要解决的问题、功能/性能要求等。
(2)建立数学模型:把问题数学化、公式化,便于计算机处理。
(3)确定算法:简单、速度快、精度高、代码量小、编程容易。
(4)绘制程序流程图:用箭头、框图、菱形图等表示程序结构。
(5)内存空间分配:为程序或数据分配内存空间。
(6)编制程序与静态检查:程序结构层次简单、清楚、易懂。
(7)程序调试:利用调试软件DEBUG进行调试。
❾ 汇编语言程序设计方法
编码不容易,望能帮到楼主。。楼主好好看
CRLF MACRO ;宏定义,实现回车换行
MOV AH, 2
MOV DL, 0DH
INT 21H
MOV AH, 2
MOV DL, 0AH
INT 21H
ENDM
D SEGMENT
SCORE DB 76,69,84,90,73,88,89,63,100,80 ; 数组接收分数
S DB 5 DUP(?) ; 预留5个位置存储每个分数段的人数
WORDS DB "THE NUMBER BETWEEN 60~69 IS: $"
WORDS1 DB "THE NUMBER BETWEEN 70~79 IS: $"
WORDS2 DB "THE NUMBER BETWEEN 80~89 IS: $"
WORDS3 DB "THE NUMBER BETWEEN 90~99 IS: $"
WORDS4 DB "THE NUMBER BETWEEN 100 IS: $"
D ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:D
BG:
MOV AX,D
MOV DS,AX
CALL COUNT ; 调用子程序
MOV AH,9 ; 输出每个分数段的人数
LEA DX,WORDS
INT 21H
MOV AH,2
MOV DL,S
ADD DL,30H
INT 21H
CRLF
MOV AH,9
LEA DX,WORDS1
INT 21H
MOV AH,2
MOV DL,S+1
ADD DL,30H
INT 21H
CRLF
MOV AH,9
LEA DX,WORDS2
INT 21H
MOV AH,2
MOV DL,S+2
ADD DL,30H
INT 21H
CRLF
MOV AH,9
LEA DX,WORDS3
INT 21H
MOV AH,2
MOV DL,S+3
ADD DL,30H
INT 21H
CRLF
MOV AH,9
LEA DX,WORDS4
INT 21H
MOV AH,2
MOV DL,S+4
ADD DL,30H
INT 21H
CRLF
MOV AH,4CH
INT 21H
COUNT: ; 子程序入口
MOV CX,10 ; 循环 10次
MOV SI,0
LOP:
INT 3
MOV AL,SCORE[SI]
CMP AL,70
JB NUMBER6 ; 比较进入不同的标号进行计算每个分数段人数
CMP AL,80
JB NUMBER7
CMP AL,90
JB NUMBER8
CMP AL,100
JE NUMBER10
JMP NUMBER9
NUMBER6: ; 不同标号之下的作用是计算每个分数段人数并存于预留的位置中
MOV BL,S
INC BL
MOV S,BL
JMP L
NUMBER7:
MOV BL,S+1
INC BL
MOV S+1,BL
JMP L
NUMBER8:
MOV BL,S+2
INC BL
MOV S+2,BL
JMP L
NUMBER9:
MOV BL,S+3
INC BL
MOV S+3,BL
JMP L
NUMBER10:
MOV BL,S+4
INC BL
MOV S+4,BL
JMP L
L:
INC SI
LOOP LOP
RET ; 子程序结束,放回主程序
CODE ENDS
END BG
❿ 简单介绍一下汇编语言程序设计
汇编比较好的书有:王爽老师《汇编语言》,杨季文老师的《80X86汇编语言程序设计》。看汇编不看保护模式的程序设计的话,汇编也就白学了,所以保护模式非常重要。当然这也是汇编一些应用的基础,比如软件解密,驱动的编写。有了好书,肯定会事半功倍的。这些书上也会肯定会有HELLO WORLD的实现。学习汇编首先从数制学起,各种数制的转换肯定也是非常重要的基础。然后学习基本的8086指令,程序设计的3种语句形式(顺序,循环,选择)接着是学习调用DOS的一些系统功能实现简单的程序,最后进入了最重要的一部分保护模式的程序设计,开始学习80386指令等等,我就不详说了,路漫漫其修远兮。以上还只是停留在DOS时代,还没有进入复杂的windows世界。现在的windows都是VISTA了。
汇编其实也不是这么神秘,不过是很多人习惯了高级语言的东西,再看汇编就很不习惯了,因为很多事情都得自己做。包括栈的平衡等。楼主既然一定想做,那么就回答了2个问题,what,why。接下来就死haw了,编程的学习当时是要靠多上机练习。轻松汇编,这是一个大学生开发的汇编集成环境,初学的时候可以在上面用。学习编程,最重要的是调试,汇编代码级的调试也是软件解密的关键。所以学了汇编,比较高的境界就是看懂别人的程序,当然不是从源代码,而是反汇编代码。保护模式很重要,因为在windows下,自己肯定是弄不了保护模式了,我不知道能不能在cmd下面调用从实模式到保护模式的程序,没试过,应该是不行吧。如果不行的话,可以装个虚拟机,里面安装DOS,在windows里面写好程序后,做成ISO文件,再进入DOS,编译执行保护模式程序,我是这么做的,不知道还有其他更简便的方法没有,你可以自己摸索下。以上是个人意见哈,供参考。