文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言-在屏幕上显示c

汇编语言-在屏幕上显示c

汇编语言-在屏幕上显示c
汇编语言-在屏幕上显示c

若要在屏幕上打印出字符c,在c语言中需要用输出函数。在本章程序中,main函数中的语句((void (far *)())(long)a)();用数组a作为函数指针,该函数指针为far型的。函数指针a所指向的函数是无返回、无参数的。因此,我们可以数组a中定义该函数的地址。

((void (far *)())(long)a)()指向的是数组a,若想通过定义数组a和该语句在屏幕中间显示字符c,则数组a中该定义显示字符c的相关机器码。刚开始我想通过语句printf("c");来获得相关的机器码,但是这相关到c中的printf函数,机器码较为复杂,最终没得到正确的结果。后来我通过编写汇编代码,在屏幕中间打印字符c,经debug来查看其机器码。汇编代码如下:

assume cs:code

code segment

start:mov al,'c'

mov ah,02

mov si,0b800h

mov es,si

mov es:[12*160+40*2],ax

mov ax,4c00h

int 21h

code ends

end start

经debug查看,得其机器码:

C程序如下:

char a[200]= {0xb0,0x63,0xb4,0x02,0xbe,0x00,0xb8,0x8e,0xc6,0x26,0xa3, 0xd0,0x07,0xb8,0x00,0x4c,0xcd,0x21}

main()

{

((void (far *)())(long)a)(); }

运行结果:

汇编语言实现字符串逆序输出

北京邮电大学 微机原理与接口技术实验报告 学院:电子工程学院 班级:2012211203 学号:2012210876 姓名:邱启哲

字符串的逆序存储实验 一、题目要求 实现将STRING1起始存取单元中的字符串’ABCDEFGHIJKLM’逆序存放到STRING2的存储单元中,并在屏幕上显示结果。 二、设计思路 在数据段定义时,将字符串’ABCDEFGHIJKLM’存入STRING1中,并定义一个空字符串数组STRING2用于存放字符。将指针[STRING1+BP]指向字符串数组STRING1的最后一个字符,指针[STRING2+BX]指向STRING2的起始字符对其进行赋值,每次赋值后STRING1的指针减一,STRING2的指针加一,循环赋值13次。赋值完成后用系统调用实现STRING2中内容的循环输出。 三、程序代码 DATA SEGMENT STRING1 DB 'ABCDEFGHIJKLM' STRING2 DB 13DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DA TA MOV DS,AX MOV CX,13 MOV BX,0 MOV BP,12 LOOP1:;此循环用于实现对STRING2的赋值功能MOV AL,[STRING1+BP];通过AL实现STRING1对STIRNG2的赋值 MOV [STRING2+BX],AL INC BX DEC BP LOOP LOOP1 MOV CX,13;将CX值复员以便进入下一个循环 MOV BX,OFFSET STRING2;使BX指向STRING2的起始字符LOOP2: MOV AH,2 ;调用2号系统调用,输出STRING2 MOV DL,[BX];用STRING2中的字符为DL赋值 INT 21H INC BX;BX加一,向后移一位 LOOP LOOP2 MOV AH,4CH;程序结束 INT 21H CODE ENDS END START

汇编语言比较两个字符串的大小

实验二比较两个字符串的大小 一、实验要求 从键盘上输入两个字符串,比较两个字符串的大小。如果第一个字符串比第二个字符串大,则显示1;如果两个字符串相等,则显示0;如果第一个字符串比第二个字符串小,则显示-1 (1)画出实现上述功能的汇编语言程序流程图 (2)写出实现上述功能的汇编语言程序 (3)编译,连接编写的汇编语言程序,并运行生成的可执行文件,描述其执行情况 (4)对上述程序进行调试 (5)描述反编译后的程序在执行前的数据段的内容何在调试过程中各寄存器的变化。 (6)写出实现上述要求的实验报告 二、实验环境 该试验包括的硬件和软件条件如下: 1、硬件环境 (1)联想AMD双核台式电脑 (2)内存1G 2、软件环境 Windows XP 三、实验步骤 1.程序流程图

2.程序代码 data segment msg1 DB "Please input a string:",'$' string1 DB 100,0,100 dup(?) msg2 DB "Please input another string:",'$' string2 DB 100,0,100 dup(?) msg3 db 0ah,0dh result DW ?,'$' Data ends Stack segment para stack db 20h dup(0) Stack ends code segment Assume Cs:code,Ss:stack,ds:Data Start: mov ax,data mov ds,ax mov es,ax lea dx,msg1 mov ah,09h int 21h lea dx,string1 mov ah,0ah int 21h

汇编语言查找匹配字符串

汇编语言实验二查找匹配字符串 一、目的 查找匹配字符串SEARCH 二、实验内容 程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。 流程图

N Y Y Y 输入关键字 结束 关键字长度=0 输入句子 句子长度<关键字长度 Y 保存关键字长度到cx,cx 入栈,保存总循环次数(句子长度-关键字长度+1) 到al,将句子的首地址放进bx(作为基址寄存器)si=di=0(变址寄存器) 开始比较[bx+di]与[si]是否相等 si+1,di+1,cx-1(同时指向下一个字符) Y N bx+1(句子指向下一个字符)cx 出栈,再入栈,si,di 清零,al-1cx 是否为0 N 匹配完成,调用子程序输出 al 是否为0 不匹配,输出三、设计和编码 DATA SEGMENT mess1DB 'Enter keyword:','$'mess2DB 'Enter Sentence:','$'mess3DB 'Match at location:','$'mess4DB 'NOT MATCH.',13,10,'$'mess5DB 'H if the sentence',13,10,'$'

change DB13,10,'$' stoknin1label byte max1db10 act1db? stokn1db10dup(?) stoknin2label byte max2db50 act2db? stokn2db50dup(?) DATA ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODE SEGMENT ;*************************************代码段 main proc far assume cs:code,ds:data,es:data START: push ds sub AX,AX sub BX,BX sub DI,DI sub SI,SI push AX;为返回dos并清空后面要用到的寄存器 MOV AX,DATA MOV DS,AX LEA DX,mess1 MOV ah,09 INT21h;输出Enter keyword LEA DX,stoknin1 MOV ah,0ah;用21号中段的0ah号功能获取关键字 INT21h cmp act1,0 je exit;如果为空直接退出程序 a10: ;********************************输入Sentence并判断 LEA DX,change MOV ah,09 INT21h;输出回程,换行 LEA DX,mess2 MOV ah,09 INT21h;输出Enter Sentence: LEA DX,stoknin2 MOV ah,0ah INT21h;用21号中段的0ah号功能获取句子 MOV AL,act1 CBW MOV CX,AX;保存关键字长度到cx PUSH CX;cx入栈 MOV AL,act2 cmp AL,0 je a50;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1 js a50;若句子长度小于关键字长度,则跳转显示not match INC AL CBW LEA BX,stokn2;将句子的首地址放进BX MOV DI,0 MOV SI,0 a20: ;****************************************比较,内循环 MOV AH,[BX+DI] CMP AH,stokn1[SI];遇见字符不相等就跳转到a30

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

汇编语言指令

汇编语言指令集 数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2

格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,O ROR,ROL,RCR,RCL

汇编语言 重复字符串操作前缀

REP/REPE/REPZ/REPNE/REPNZ - 重复字符串操作前缀 操作码指令说明 F3 6C REP INS r/m8, DX 将(E)CX 个字节从端口DX 输入到ES:[(E)DI] F3 6D REP INS r/m16,DX 将(E)CX 个字从端口DX 输入到ES:[(E)DI] F3 6D REP INS r/m32,DX 将(E)CX 个双字从端口DX 输入到ES:[(E)DI] F3 A4 REP MOVS m8,m8将(E)CX 个字节从DS:[(E)SI] 移到ES:[(E)DI] F3 A5 REP MOVS m16,m16将(E)CX 个字从DS:[(E)SI] 移到ES:[(E)DI] F3 A5 REP MOVS m32,m32将(E)CX 个双字从DS:[(E)SI] 移到ES:[(E)DI] F3 6E REP OUTS DX,r/m8将(E)CX 个字节从DS:[(E)SI] 输出到端口DX F3 6F REP OUTS DX,r/m16将(E)CX 个字从DS:[(E)SI] 输出到端口DX F3 6F REP OUTS DX,r/m32将(E)CX 个双字从DS:[(E)SI] 输出到端口DX F3 AC REP LODS AL 将(E)CX 个字节从DS:[(E)SI] 加载到AL F3 AD REP LODS AX 将(E)CX 个字从DS:[(E)SI] 加载到AX F3 AD REP LODS EAX 将(E)CX 个双字从DS:[(E)SI] 加载到EAX F3 AA REP STOS m8使用AL 填写位于ES:[(E)DI] 的(E)CX 个字节 F3 AB REP STOS m16使用AX 填写位于ES:[(E)DI] 的(E)CX 个字 F3 AB REP STOS m32使用EAX 填写位于ES:[(E)DI] 的(E)CX 个双字 F3 A6 REPE CMPS m8,m8在ES:[(E)DI] 与DS:[(E)SI] 中查找不匹配的字 节 F3 A7 REPE CMPS m16,m16在ES:[(E)DI] 与DS:[(E)SI] 中查找不匹配的字 F3 A7 REPE CMPS m32,m32在ES:[(E)DI] 与DS:[(E)SI] 中查找不匹配的双 字

汇编语言使用宏定义输出字符串

实验4 DOS系统功能调用 班级:xxx 学号:xxx 姓名:xxx 实验题目:完善“调用宏DOSINT:调用DOS系统功能实现字符串的输出和输入,其中10号功能需要的字符数要求从键盘输入”,要求输入的数字是多位数。 实验目的: 1. 掌握DOS系统功能的调用过程和方法; 2. 熟悉源程序基本组成:assume的使用、段寄存器的赋值、程序返回; 3. 掌握MASM、LINK、DEBUG等工具的使用。 实验设备: 软件:DOS操作系统、编辑软件、MASM 5.0 实验内容: 1.程序代码 DOSINT MACRO NO MOV AH,NO INT 21H ENDM DATA SEGMENT ERRSTR DB 'ERROR NUMBER!$' Hello DB 'Hello World!$' STRING DB ?,?,16 DUP(?),'$';预留空间 DATA ENDS CODE SEGMENT ASSUME DS:DA TA,CS:CODE BEGIN: MOV AX,DA TA MOV DS,AX ;初始化DS MOV DX,OFFSET Hello ;串首地址送DX DOSINT 9 ;宏调用 DOSINT 1 ;宏调用 CALL ASCIINUM ;子程序调用 MOV BL,AL DOSINT 1 ;宏调用 CALL ASCIINUM MOV CL,AL MOV AL,BL MOV BL,10 IMUL BL ADD AL,CL MOV STRING,AL MOV DL,0AH DOSINT 2 LEA DX, STRING ;取预留空间首地址 DOSINT 10

用汇编语言实现字符统计算法

上海电力学院实验报告计算机硬件实验课程 题目:字符统计算法的实现 班级: 姓名: 学号:

一、实验目的 通过实验,掌握MASM工具调试汇编程序、熟悉DOS功能调用。 二、实验要求 从键盘输入一系列字符,以回车符结束,编程统计其中非数字字符的个数。 三、实验内容 程序首先调用DOS 功能的1号功能,从键盘输入字符。为得到字符串,可以采用循环结构,连续输入。在输入的过程中通过判断是否是回车来结束输入。其中回车的ASII 码(0DH)。数字的0的ASII码(30H)9的(39H)。 四、流程图 Next1函数: 从键盘键入字符 送字符入缓冲 修改偏移地址SI+1 Al与0DH作比较 不相等相等 Al与0比较exit 大于等于小于 Next dl+1 Next函数: AL与9比较 小于 等于大于 转到Next1 dl+1 转到Next1

Exit函数: dl变为ASC11码 单字符输出 返回dos 五、实验设计与实现 1)编写实验程序如下 data segment buf db 20h dup(?) cnt db ? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax lea si,buf si指向buf首单元 mov dl,0 记数器DL清零 next1: mov ah,1 从键盘输入一个字符 int 21h mov buf,al 输入字符送缓冲区 inc si cmp al,0dH je exit 输入回车键转exit cmp al,30h jae next 输入字符的ASII码大于等于30h转next inc dl 否则记数器加1 next: cmp al,39h jbe next1

用汇编语言编写比较2个字符串长度的程序

用汇编语言编写比较2个字符串长度的程序 一、实验题目: 比较两个字符串.假设两个字符串分别放在DS段(设ES=DS)的STR1和STR2区域,其长度分别为L1和L2,比较这两个字符串相等.若相等,则置M1单元内容为FFH,否则为00H. 二、实验目的: 掌握提示信息的设置方法及键盘读取输入信息的方法。 三、实验原理: 1、利用16位微机处理器8680/8088系统汇编语言的基本法则、表达式、运算符、常用伪指令和dos功能调用及汇编设计的基本方法; 2、汇编语言程序的分段结构、语句格式、表达式和运算符; 3、变量定义伪指令、段指令伪指令以及其他常用伪指令的功能; 4、顺序、分支、循环、子程序等四类结构程序的特点和编程方法。 四、实验程序设计: DA TA SEGMENT STRING1 DB ‘ASFIOA’ STRING2 DB ‘XCVIYOAF’ MESS1 DB ‘FFH$’ MESS2 DB ‘00H$’ DA TA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS: CODE, DS: DATA START: PUSH DS SUB AX, AX PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX BEGIN: MOV CX, STRING2-STRING1 MOV BX,MESS1-STRING2 CMP BX, CX JNZ DISPNO LEA DX, ADDR LEA SI, STRING1 LEA DI, STRING2 REPE CMPSB JNE DISPNO MOV AH, 9 LEA DX, MESS1 INT 21H RET DISPNO: MOV AH, 9 LEA DX, MESS2 INT 21H

汇编语言实战经验

汇编语言实战经验 “ 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情

汇编语言入门教程

汇编语言入门教程 一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU 和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为: 8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,

从键盘输入字符串并输出该字符串(总汇编程序)

从键盘输入字符串并输出该字符串(汇编程序) DATAS SEGMENT STR DB"please input a string:$" BUF DB 20 DB ? DB 20 DUP (?) CRLF DB 0AH,0DH,"$";此处输入数据段代码 DATAS ENDS STACKS SEGMENT STACK DB 200 DUP(?) ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,10 LEA DX,BUF INT 21H

LEA DX,CRLF MOV AH,9 INT 21H MOV CL,BUF+1 LEA SI,BUF+2 NEXT: MOV DL,[SI] MOV AH,2 INT 21H INC SI DEC CL JNZ NEXT;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START 以上是从键盘输入字符串并输出该字符串的简单汇编程序,我们老师的要将程序中的2号调用改成9号调用,本人还在思考中,有能解决此问题的请回复,谢谢! 如果我了解了该题答案,一定和大家共享。

续一: 我们汇编老师的教学是先让我们看程序,写程序,再讲基本指令,基本结构…… 学习汇编重要的是掌握CPU结构、程序结构以及熟练的掌握7种指令的运用。 以下是本人整理的对上面程序的部分解释: BUF:键盘缓冲区BUF。 DB:定义变量的类型为字节类型。 DB 20:表示缓冲区能容纳20个字符。 DB 200 DUP(?)中的问号:不对分配的存储单元初始化。 DS:存放当前数据段的段地址。 CS:存放当前代码段的段地址。 SS:存放当前堆栈段的段地址。 MOV:传送指令。 AX:存放接收到的数据或发送数据。 DX:使用间接寻址时存放端口地址。 LEA:取偏移地址。

汇编语言字符串输入与输出

字符串输入,字符串输出 DATA SEGMENT BUF DB30DUP("$");DUP是“$”!!!!!!,无论前面是否已经定义有空间 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,0AH LEA DX,BUF INT21H MOV AH,09H LEA DX,BUF+2;是BUF+2!!!! INT21H MOV AH,4CH INT21H CODE ENDS END START 运行: 如果加入换行: DATA SEGMENT BUF DB30DUP("$") CRLF DB0DH,0AH,"$";要加上“$”!!! DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,0AH LEA DX,BUF INT21H

LEA DX,CRLF;换行!!! MOV AH,09H INT21H MOV AH,09H LEA DX,BUF+2 INT21H MOV AH,4CH INT21H CODE ENDS END START 结果: 加入提示语句: DATA SEGMENT BUF DB30DUP("$") CRLF DB0DH,0AH,"$" MESS1DB'INPUT THE STRING:','$' MESS2DB'OUTPUT THE STRING:',"$";”$”必须加在后面!!!!DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,09H;提示语MESS1输出显示!!! LEA DX,MESS1 INT21H MOV AH,0AH LEA DX,BUF INT21H LEA DX,CRLF MOV AH,09H

汇编语言表格显示字符

计算机学院 网络工程四班 实验2.1 用表格形式显示字符 1.题目:用表格形式显示ASCII字符SMASCII 2.实验要求: 按15行*16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个 字符之间用空白符(ASCII为0)隔开。 3.提示: (1)显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下: mov ah,02h mov dl,输出字符的ASCII码 int 21h (2)显示空白符时,用其ASCII码0置入dl寄存器。每行结束时,用显示回车(ASCII 为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。 (3)由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASCII字符。 具体做法是:在显示空白或回车、换行符前用指令 push dx 把dl的内容保存到堆栈中去。在显示空白或回车、换行符后用指令 pop dx 恢复dl寄存器的原始内容。 4.程序清单: code segment assume cs:code start: mov dx,0010h next: mov cx,10h loop1: mov ah,02h int 21h inc dx push dx mov dl,0 int 21h pop dx loop loop1

push dx mov dl,0ah int 21h mov dl,0dh int 21h pop dx cmp dx,100h jb next mov ah,4ch int 21h code ends end start 5.运行结果如下: 6.实验总结: 通过本次实验我深刻的知道用汇编语言编译程序的方法,掌握了如何合理的利用各个寄存器进行程序的控制操作,初步了解到循环程序的控制方法,以及dos中断调用的基本要领对学习汇编语言有了非常好的帮助作用!

字符串匹配汇编语言程序设计

课程设计 题目字符串匹配汇编语言程序设计学院自动化学院 班级电气1003班 姓名申廷进 指导教师徐腊梅 2013 年01 月17 日

课程设计任务书 学生姓名:申廷进专业班级:电气1003班 指导教师:徐腊梅工作单位:自动化学院 题目: 字符串匹配汇编语言程序设计 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1)根据提示信息,从字符输入两个字符串,实现两个字符串的比较,如 果两个字符串的字符只要有一个相同则显示“MATCH”,否则显示“NO MATCH”。 2)可连续输入字符进行比较,直至单击“Q”或“q”键退出程序。 时间安排: 1.9 课设题目,设计内容; 1.9—1.10 查资料,算法、方案设计。 1.10—1.13 (硬)软件设计 1.14—1.15 调试程序 1.16—1.17 写课设报告 1.18 答辩 指导教师签名:年月日 系主任(或责任教师)签名:年月日

1 设计总体方案 (2) 1.1 设计目的 (2) 1.2 设计要求及其条件 (2) 1.3 设计方案 (2) 2 程序流程图分析 (3) 2.1 转移流程图的分析 (3) 2.2 流程图总体分析 (3) 3 程序段落的说明 (5) 3.1 换行回车键的定义 (5) 3.2 提示信息和字符串的定义 (5) 3.3 DOS功能和部分指令的说明 (6) 4 程序调试说明、结果记录与分析 (7) 4.1 程序调试说明 (7) 4.2 调试结果说明 (7) 4.3 分析结果 (9) 5心得体会 (9) 参考文献 (11) 附件 (12)

微型计算机简称微机,由于其具备人脑的某些功能,所以也称其为微电脑。是由大规模集成电路组成的、体积较小的电子计算机。它是以微处理器为基础,配以内存储器及输入输出接口电路和相应的辅助电路而构成的裸机。把微型计算机集成在一个芯片上即构成单片微型计算机。学习微机课程,主要内容包括微型计算机体系结构、8086微处理器和指令系统、汇编语言、设计以及微型计算机各个组成部分,而汇编语言是其中一大板块。 汇编语言编程不仅具有计算机提供给用户的最快而又最有效的语言的优势,也可以在不很了解计算机硬件的前提下使用它。在对于程序的空间和时间要求很高的场合,使用汇编语言是必不可少,甚至对于很多需要直接控制硬件的应用场合,用保护模式下的汇编语言编程也提供给了对硬件不了解的初学者一种方法。 关键词:微机汇编语言编程

北京理工大学汇编语言实验报告实验三字符串操作实验

实验三字符串操作实验 一、实验目的 1)熟悉串操作指令的功能与应用; 2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序; 3)了解汇编语言字符串处理基本流程; 二、实验软硬件环境 1)硬件环境:惠普64位一体化计算机及局域网; 2)软件环境:windows8,红蜘蛛管理系统,MASM for Windows。 三、实验相关知识 1)字符串操作流程 SI寄存器保存源串首地址; DI寄存器保存目的串首地址; CX寄存器保存字符串长度; CLD或STD指令设置字符串处理方向; 当CLD指令使DF=0,在执行串处理指令时可使地址自动增量;STD使DF=1,在执行串处理指令时可使地址自动减量。 2)重复前缀指令 重复次数由计数寄存器CX中存放的值决定,指令每重复执行一次,计数器CX中值减1,当CX中值减至0时,停止重复执行,继续执行下一条指令。 当REP无条件重复前缀,重复串操作直到计数寄存器的容CX为0为止。经常与REP配合工作的字符串处理指令有MOVS、STOS和LODS。 当REPE/REPZ判断计数寄存器的容CX是否为0或ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。 当REPNE/REPNZ判断计数寄存器的容是否为0或ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。 3)字符串操作指令 lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志

从键盘输入字符串并输出该字符串(汇编程序)

从键盘输入字符串并输出该字符串(汇编程序) DATAS SEGMENT STR DB"please in PUt a Stri ng:$" BUF DB20 DB ? DB 20 DUP (?) CRLF DB OAH,ODH,"$"; 此处输入数据段代码 DATAS ENDS STACKS SEGMENT STACK DB 200 DUP(?); 此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,10 LEA DX,BUF INT 21H LEA DX,CRLF MOV AH,9 INT 21H MOV CL,BUF+1 LEA SI,BUF+2 NEXT: MOV DL,[SI] MOV AH,2 INT 21H INC SI DEC CL JNZ NEXT; 此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START 以上是从键盘输入字符串并输出该字符串的简单汇编程序,我们老师的要求是将程序中的2号调用改成9号调用,本人还在思考中,有能解决此问题的请回复,

谢谢! 如果我了解了该题答案,一定和大家共享。 续一: 我们汇编老师的教学是先让我们看程序,写程序,再讲基本指令,基本结构…… 学习汇编重要的是掌握CPU吉构、程序结构以及熟练的掌握7种指令的运用。 以下是本人整理的对上面程序的部分解释: BUF :键盘缓冲区BUF DB :定义变量的类型为字节类型。 DB 20 :表示缓冲区能容纳20个字符。 DB 200 DUP(?)中的问号:不对分配的存储单元初始化。 DS :存放当前数据段的段地址。 CS :存放当前代码段的段地址。 SS :存放当前堆栈段的段地址。 MoV :传送指令。 AX :存放接收到的数据或发送数据。 DX :使用间接寻址时存放端口地址。 LEA :取偏移地址。 CL :在移位指令和循环移动指令中,存放移位次数或者循环移位次数。 SI :在存储器寻址时,作为变址寄存器。在串操作中,作为源串指针。 DECdecreme nt

汇编语言程序设计实验4

实验四字符串的匹配与替换程序设计一、实验目的 1)掌握串操作指令的使用方法。 2)掌握串处理程序的设计方法。 3)熟练使用各种程序结构。 二、实验内容 1)编制两个字符串比较子程序。 源程序: DATA SEGMENT STR1 DB '0123456789ABCDEFGH' STR2 DB '0123456789ABCDEFGH' COUNT EQU $ - STR2 FLAG DB ? RESULT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE;DS:DATA;ES:DATA START:MOV AX,DATA MOV DS,AX MOV ES ,AX LEA SI,STR1 LEA DI,STR2 MOV CX,COUNT

MOV AL,0 CLD REPZ CMPSB JZ EXIT MOV AL,0FFH EXIT:SUB SI,OFFSET STR1 MOV BX,SI MOV RESULT,BL MOV FLAG,AL MOV AH,4CH INT 21H CODE ENDS END START 运行结果:

2)编制在一个字符串中查找给定字符串的程序。 源程序: DATA SEGMENT BUFSTR DB 'ABCDADAAFAGAGAAGAGALWETQTQTOIPPOIY' NUM1 EQU $-BUFSTR SUBSTR DB 'ABC' NUM2 EQU $-SUBSTR COUNT DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BUFSTR LEA DI,SUBSTR MOV CX,NUM2 MOV BX,NUM1 MOV DL,0

相关文档
相关文档 最新文档