AT&T汇编语言语法

AT&T汇编语言语法
AT&T汇编语言语法

AT&T汇编语言语法

1.Register Reference

引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。

80386 有如下寄存器:

[1] 8 个32-bit 寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp;( 8 个16-bit 寄存器,它们事实上是上面8 个32-bit 寄存器的低16 位:%ax,%bx,

%cx,%dx,%di,%si,%bp,%sp;

8 个8-bit 寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。它们事实上

是寄存器%ax,%bx,%cx,%dx 的高8 位和低8 位;)

[2] 6 个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;

[3] 3 个控制寄存器:%cr0,%cr2,%cr3;

[4] 6 个debug 寄存器:%db0,%db1,%db2,%db3,%db6,%db7;

[5] 2 个测试寄存器:%tr6,%tr7;

[6] 8 个浮点寄存器

栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。

2. Operator Sequence

操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)”

3. Immediately Operator

使用立即数,要在数前面加符号$, 如“movl $0x04, %ebx”

或者:

para = 0x04

movl $para, %ebx

指令执行的结果是将立即数0x04 装入寄存器ebx。

4. Sym bol Constant

符号常数直接引用如

value: .long 0x12a3f2de

movl value , %ebx

指令执行的结果是将常数0x12a3f2de 装入寄存器ebx。

引用符号地址在符号前加符号$, 如“movl $value, % ebx”则是将符号value 的地址装入寄存器ebx。

5. Length of Operator

操作数的长度用加在指令后的符号表示b(byte, 8-bit), w(word, 16-bits), l(long,32-bits),如“m ovb %al, %bl”,“movw %ax, %bx”,“movl %eax, %ebx ”。

如果没有指定操作数长度的话,编译器将按照目标操作数的长度来设置。比如指令

“m ov %ax, %bx”,由于目标操作数bx 的长度为word,那么编译器将把此指令等同于

“m ovw %ax,%bx”。同样道理,指令“mov $4, %ebx”等同于指令“movl $4, %ebx”,“push %al”等同于“pushb %al”。对于没有指定操作数长度,但编译器又无法猜测的指令,编译器将会报错,比如指令“push $4”。

6. Sign and Zero Extension

绝大多数面向80386 的AT&T 汇编指令与Intel 格式的汇编指令都是相同的,但符号扩展指令和零扩展指令有不同格式。符号扩展指令和零扩展指令需要指定源操作数长度和目的操作数长度,即使在某些指令中这些操作数是隐含的。

在AT&T 语法中,符号扩展和零扩展指令的格式为,基本部分"movs"和"movz"(对应Intel 语法的movsx 和movzx),后面跟上源操作数长度和目的操作数长度。movsbl 意味着movs

(from)byte (to)long;movbw 意味着movs (from)byte (to)word;movswl意味着movs (from)word (to)long。对于movz 指令也一样。比如指令“movsbl %al,%edx”意味着将al 寄存器的内容进行符号扩展后放置到edx 寄存器中。

其它的Intel 格式的符号扩展指令还有:

cbw -- sign-extend byte in %al to word in %ax;

cwde -- sign-extend word in %ax to long in %eax;

cwd -- sign-extend word in %ax to long in %dx:%ax;

cdq -- sign-extend dword in %eax to quad in %edx:%eax;

对应的AT&T 语法的指令为cbtw,cwtl,cwtd,cltd。

7. Call and Jump

段内调用和跳转指令为"call","ret"和"jmp",段间调用和跳转指令为"lcall","lret"和"ljmp"。段间调用和跳转指令的格式为“lcall/ljmp $SECTION, $OFFSET”,而段间返回指令则为“lret $STACK-ADJUST”。

8. Prefix

操作码前缀被用在下列的情况:

[1]字符串重复操作指令(rep,repne);

[2]指定被操作的段(cs,ds,ss,es,fs,gs);

[3]进行总线加锁(lock);

[4]指定地址和操作的大小(data16,addr16);

在AT&T 汇编语法中,操作码前缀通常被单独放在一行,后面不跟任何操作数。例如,对于重复scas 指令,其写法为:

repne

scas

上述操作码前缀的意义和用法如下:

[1]指定被操作的段前缀为cs,ds,ss,es,fs,和gs。在AT&T 语法中,只需要按照

section:m emory-operand 的格式就指定了相应的段前缀。比如:

lcall %cs:realmode_swtch

[2]操作数/地址大小前缀是“data16”和"addr16",它们被用来在32-bit 操作数/地址代码中指定16-bit 的操作数/地址。

[3]总线加锁前缀“lock”,它是为了在多处理器环境中,保证在当前指令执行期间禁止一切中断。这个前缀仅仅对ADD, ADC, AND, BTC, BT R, BTS, CMPXCHG,DEC,

INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,XCHG 指令有效,如果将Lock 前

缀用在其它指令之前,将会引起异常。

[4]字符串重复操作前缀"rep","repe","repne"用来让字符串操作重复“%ecx”次。

9. Mem ory Reference

Intel 语法的间接内存引用的格式为:

section:[base+index*scale+displacem ent]

而在AT&T 语法中对应的形式为:

section:displacem ent(base,index,scale)

其中,base 和index 是任意的32-bit base 和index 寄存器。scale 可以取值1,2,4,8。如果不指定scale 值,则默认值为1。

section 可以指定任意的段寄存器作为段前缀,默认的段寄存器在不同的情况下不一样。如果在指令中指定了默认的段前缀,则编译器在目标代码中不会产生此段前缀代码。

下面是一些例子:

-4(%ebp):base=%ebp,displacem ent=-4,section 没有指定,由于base=%ebp,所以默认的section=%ss,index,scale 没有指定,则index 为0。

foo(,%eax,4):index=%eax,scale=4,displacem ent=foo。其它域没有指定。这里默认的

section=%ds。

foo(,1):这个表达式引用的是指针foo 指向的地址所存放的值。注意这个表达式中没有base 和index,并且只有一个逗号,这是一种异常语法,但却合法。

%gs:foo:这个表达式引用的是放置于%gs 段里变量foo 的值。

如果call 和jump 操作在操作数前指定前缀“*”,则表示是一个绝对地址调用/跳转,也就是说jmp/call 指令指定的是一个绝对地址。如果没有指定"*",则操作数是一个相对地址。

任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸

(byte,word,long),也就是说必须带有指令后缀(b,w,l)。

第四章汇编语言程序设计题库

第四章汇编语言程序设计练习题 一、单项选择题(共40题) 1、关于指令MOV [BX],AX,以下叙述正确的是: A、目的操作数是寄存器操作数 B、源操作数是内存操作数 C、目的操作数是内存操作数 D、源操作数是立即操作数 2、执行下列程序,设(SS)=2000H,执行后(SP)=? MOV SP,2000H MOV AX,1234H PUSH AX A.21FFEH B.20000H C.22000H D.22002H 3、运算型指令的寻址和转移型指令的寻址,其不同点在于 A.前者取操作数,后者决定程序的转移地址 B.后者取操作数,前者决定程序的转移地址 C.两者都是取操作数 D.两者都是决定程序的转移地址 4、MOV ( ),300 A、WORD PTR [DX] B、BYTE PTR [BX] C、WORD PTR [BP] D、 AL 5、汇编语言程序代码必须位于代码段中,形成代码段物理地址的寄存器对是 A.SS: SP B.CS: IP C. DS: BX D. CS: BX 6、若定义DAT DW 'A',则(DAT)和(DAT+1)两个相邻的内存中存放的数据是() A.0041H B.4100H C.××41H D.4l××H 7、执行下面的程序段后,(AX)=() TAB DW 1,2,3,4,5,6 ENTRY EQU 3 MOV BX,OFFSET TAB ADD BX,ENTRT MOV AX,[BX] A.0003H B.0300H C.0400H D.0004H 8、下面表示段定义结束的命令是() A.ENDP B.ENDS C. ENDM D.END 9、设AL、BL,中都是带符号数,当AL<BL时转至NEXT处,在CMP AL,BL指令后应选用正确的条件转移指令是()

实验1_认识汇编语言

实验一 认识汇编语言 1.1 实验目的 (1)理解汇编语言的概念及其与高级语言的区别 (2)了解MASM6.11和TASM软件包的安装及配置 (3)了解常用汇编语言集成环境 (4)掌握汇编语言程序的上机过程 1.2 预备知识 1.2.1 系统环境 对汇编语言的初学者来说,DOS环境的优点是:DOS操作系统简单,程序员可以管理系统的所有资源,访问和修改系统中的所有内存(包括内存控制块、中断向量表),直接对I/O端口进行读写,便于对知识的学习和理解。其缺点是:单任务的DOS操作系统只有一个运行级别,任何进程与DOS操作系统都是同等级别的,致使系统中各个进程会相互影响。如果某个进程死机,整个系统就会瘫痪。 但是DOS系统已经退出历史舞台,目前的学生只熟悉Windows环境而对DOS知之甚少,继续要求学生在DOS系统的命令行界面下编写和调试程序,无疑存在巨大的困难。 目前,IBM PC及其兼容机配置的Intel系列微处理器可以工作在实模式、保护模式和虚拟86三种模式下。实模式是汇编语言入门的基础,是汇编语言教学中无法跨越的阶段。了解实模式是理解内存分段式管理和寻址方式的基础。保护模式是Windows系统的工作模式,虚拟86模式则是在保护模式下提供的模拟8086处理器工作的模式,为学习汇编语言提供了便利。DOS汇编程序在Win32环境中运行时,操作系统会模拟实模式运行16位进程。对于一些可能会影响整个操作系统工作的指令,windows操作系统会拒绝执行。64位的Windows 环境则不提供16位应用的虚拟环境。 因此,采用Win32环境进行汇编语言程序的编辑工作,在虚拟控制台环境中学习(汇编、连接和调试)汇编语言是最佳方案。下面我们将逐步给大家讲解如何安装和配置汇编语言的编译调试环境,并选择适合的编辑软件来组建汇编语言的集成环境。最后,叙述如何使用Visual Studio 2008 Express作为汇编语言的工作环境。 1.2.2 汇编语言上机过程 汇编语言程序需要经过编辑、汇编、连接、调试与执行等过程才能实现其具体功能。图1-1说明了汇编语言的上机过程。 第一步:编辑 使用编辑软件创建和编写汇编语言源文件,并以 .asm 作为文件名后缀。 第二步:汇编 使用汇编程序将源程序翻译成机器码形式的文件,以 .obj 为后缀的目标程序。汇编包括把源程序翻译成目标代码,并产生中间的.OBJ文件或模块。汇编程序的任务是为数据段中的每个数据项和代码段中的每条指令计算偏移值,并在所产生的.OBJ模块的前面直接建立一个头部来存储不确定的地址信息。在汇编时可以选择产生列表文件(.LST)和交叉引用文件(.CRF)。列表文件含有出错诊断信息,可以用来帮助检查源程序中的错误。交叉引用文件在编写大型程序时可以提供指令引用的数据项列表。 第三步:连接 使用连接程序完成对于目标程序的装配工作,生成可执行程序,以.exe或者.com为后缀的执行文件。连接程序的任务包括确定由汇编程序遗留下来的不确定的地址,并把分别汇

汇编语言程序设计实验报告

微机原理实验报告 实验名称汇编语言程序设计 一、实验目的 1、掌握Lab6000p实验教学系统基本操作; 2、掌握8088/8086汇编语言的基本语法结构; 3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备 装有emu8086软件的PC机 三、实验内容 1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH, 97H,64H,BBH,7FH,0FH,D8H。编程并显示结果:如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最大值,并显示。 2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H 的BCD是:” 3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD 码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再 将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1,2 ,3…0AH…64H(16进制-ASCII码并显示子程序) 5、键盘输入一个小写字母(a~z),转换成大写字母 显示:请输入一个小写字母(a~z): 转换后的大写字母是: 6、实现4字节无符号数加法程序,并显示结果,如99223344H + 第1页

99223344H = xxxxxxxxH 四、实验代码及结果 实验代码见代码附录 1.1程序运行结果 图1 无符号最大值结果截图 1.1 程序运行结果

图2 有符号最大值截图2.0 程序运行结果

图3 BCD码显示3.0 程序运行结果

图4 ASCII码显示4.0 程序运行结果

图5 移动次数显示5.0 程序运行结果

汇编语言程序设计实验篇emu

1.汇编语言程序设计实验篇 1.1.汇编系统软件简介 Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。 1.1.1创建程序 https://www.360docs.net/doc/f26818785.html, TEMPLATE程序 本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。 在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。 输入全部指令后,单击按钮,保存相应的程序段。 2.EXE TEMPLATE程序 本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。 在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

汇编语言程序设计

汇编语言程序设计 实验报告 实验名称上机过程及顺序结构与分支结构程序设计实验班级 学号 姓名 日期2017年10月26号 成绩 评阅人 软件学院

一、实验目的与意义 理解并熟练掌握汇编语言程序设计过程中的编辑、汇编、链接和调试等各个步骤,提高对汇编课程内容的理解和汇编语言的掌握,通过上机练习加深对课程内容的理解和掌握。通过汇编语言编制的程序上机调试、运行检验程序设计是否正确。熟悉和掌握编辑、汇编、连接和调试四个实用程序的使用方法,掌握调试程序中的几个常用命令的使用方法。熟悉其基本的指令操作,debug调试操作命令以及分支结构、顺序结构和循环结构的程序设计。 二、实验环境 操作系统:Microsoft Windows8 集成环境:Masm for Windows 上机地点:信息楼B405教室 三、实验的预习内容 预习的主要内容: 1. 使用DEBUG命令的方法; 2. 熟悉掌握从理论上定义数据的类型(即DB,DW,DD,); 3. 分支结构和顺序结构的步骤以及相关的指令; 4. 常用的标志位状态及相应的作用; 实验思路: 在对题目进行分析后,分析出解题方法,并做出与实验思路相对应的程序框图。依照程序框图的内容输入相对应的代码,最终在调试代码后,发现并解决一系列的汇编语言错误。进一步优化算法。实验之前必须了解十进制、十六进制和ASCII码之间的转换。预习查表法相关命令,掌握顺序程序的结构,从键盘输入数据的命令及显示到屏幕上的命令。 实验一: 题目1:将程序编辑、汇编、连接并通过集成环境中的debug调试,观察运行结果;用E命令修改指定地址的数据,再用G命令执行程序查看变化,用A 命令将加法指令修改成减法指令,再将其编译运行,查看寄存器值变化的异同。 题目2:分别用DB、DW和DD数据段9H,0FAH,41H,27H,编译链接之后生成exe文件,再用debug的r命令找到数据段地址,用d命令指定数据段地址,观察汇编后在机器内部对应的存储情况。 实验二: 先设置数据段地址和堆栈段地址;设置堆栈段指针;读取一个字符然后存储在AL中;用BX来存储AL中字符对应的数值;将BX中的值作为偏移地址;并在数据段中查找对应字符串;最终输出结果结束程序。 实验三: 先初始化数据段地址与堆栈段地址;设置堆栈段指针;然后将数据段中的data1放入AL中;读取数据段中的data2并判断data2是否大于0;然后读取数

第四章 汇编语言程序设计

第四章汇编语言程序设计 1、编程将片内40H~60H单元中的内容送到以3000H为首的存储区内。 答:MOV R1,#40H MOV R2,#21H MOV DPTR,#3000H L1: MOV A,@R1 MOVX @DPTR,A INC R1 INC DPTR DJNZ R2,L1 2、编程计算下列算式的程序 (1)23H+45H+ABH+03H= MOV A,#23H ADD A,#45H ADD A,#0ABH XCH A,B ;溢出处理 ADDC A,#00H XCH A,B ADD A,#03H ;A中为结果低位,B中为高位 (2)CDH+15H-38H-46H= MOV A,#0CDH ADD A,#15H SUBB A,#38H SUBB A,#46H (3)1234H+8347H= MOV A,#34H ADD A,#47H MOV 30H,A MOV A,#12H ADDC A,#83H MOV 31,A ;30H存结果低位,31H存结果高位 (4)AB123H-43ADCH= CLR C MOV A,#23H SUBB A,DCH MOV 30H,A MOV A,#0B1H SUBB A,#3AH MOV 31H,A MOV A,#0AH SUBB A,,#04H MOV 32H,A ;30H为低位,32H为高位 3、设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求他们的和,并送入43H、42H单元中(低位在低字节,高位在高字节)。

答: MOV A ,22H ADD A ,32H MOV 42H ,A MOV A ,23H ADDC A ,33H MOV 43H ,A 4、略 5、编程计算片内RAM 区50H ~59H 单元中数的平均值,结果存放在5AH 中。 答: MOV R0,#8 MOV R1,#50H MOV A ,#00H L1: ADD A ,@R1 INC R1 DJNZ R0,L1 MOV B ,#8 DIV AB MOV 5AH ,A 6、编写计算下式的程序。设乘积和平方结果均小于255。a 、b 值分别存在片外3001H 和3002H 单元中,结果存于片外3000H 单元中。 (1)?? ???÷?=b a b a Y 25b a b a b a ><=,,, MOV DPTR ,#3001H MOVX A ,@DPTR MOV 30H ,A ;a 暂存30H 单元 INC DPL MOVX A ,@DPTR CJNE A ,30H ,L1 ;是否a=b MOV A ,#25 SJMP SAVE L1: JNC L2 MOV B ,30H MUL AB SJMP SAVE L2: MOV B ,A MOV A ,30H DIV AB SAVE: MOV DPTR ,#3000H MOVX @DPRT ,A (2)?? ???-++++=10)() (10)(222b a b a b a Y 10)(,10)(,10)(,222>+=+<+b a b a b a

汇编器实验报告doc

汇编器实验报告 篇一:汇编实验报告 实验一(1)熟悉汇编语言程序调试环境及顺序程序设计 一、实验目的及要求: 1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。 2.学会使用EDIT、MASM、LINK、DEBUG等软件工具。 3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。 二、熟悉汇编语言程序调试环境 1.汇编语言源程序的建立 本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。设定源程序的文件名为ABC。 DATA SEGMENT BUFDB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,7FH CN EQU $-BUF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: PUSH DS

XOR AX,AX PUSH AX MOVAX,DATA MOV DS,AX MOV BX,OFFSET BUF MOV CX,CN DEC CX MOV AL,[BX] INC BX LP:CMP AL,[BX] JBE NEXT MOV AL,[BX] NEXT: INC BX DEC CX JNZ LP MOV AH,4CH INT 21H CODE ENDS END START 键入以下命令: C:\>EDIT ABC.ASM 此时屏幕的显示状态如图1所示。

1 图1 用EDIT编辑ABC.ASM程序窗口 程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。 2.将源程序文件汇编成目标程序文件 一般情况下,MASM汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。 (2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。 (3)若程序中使用了宏指令,则汇编程序将展开宏指令。 源程序建立以后,在DOS状态下,采用宏汇编程序MASM 对源程序文件进行汇编,其操作过程如图2所示。 图2 MASM宏汇编程序工作窗口 汇编过程的错误分警告错误(Warning Errors)和严重错误(Severe Errors)两种。其中警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数、错误的性质。这时,就要对错误进行分析,找出原因和问题,然后再调用屏幕编辑程序加以修改,修改以后再重新汇编,一直到汇编无错误为止。 3.用连接程序生成可执行程序文件

X86汇编语言学习

X86汇编语言学习手记 X86汇编语言学习手记(1) 1. 编译环境 OS: Solaris 9 X86 Compiler: gcc 3.3.2 Linker: Solaris Link Editors 5.x Debug Tool: mdb Editor: vi 注:关于编译环境的安装和设置,可以参考文章:Solaris 上的开发环境安装及设置。 mdb是Solaris提供的kernel debug工具,这里用它做反汇编和汇编语言调试工具。 如果在Linux平台可以用gdb进行反汇编和调试。 2. 最简C代码分析 为简化问题,来分析一下最简的c代码生成的汇编代码: # vi test1.c int main() { return 0; } 编译该程序,产生二进制文件: # gcc test1.c -o test1 # file test1 test1: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped test1是一个ELF格式32位小端(Little Endian)的可执行文件,动态链接并且符号表没有去除。 这正是Unix/Linux平台典型的可执行文件格式。 用mdb反汇编可以观察生成的汇编代码: # mdb test1 Loading modules: [ libc.so.1 ]

> main::dis ; 反汇编main函数,mdb的命令一般格式为<地址>::dis main: pushl %ebp ; ebp寄存器内容压栈,即保存main函数的上级调用函数的栈基地址 main+1: movl %esp,%ebp ; esp值赋给ebp,设置main函数的栈基址main+3: subl $8,%esp main+6: andl $0xf0,%esp main+9: movl $0,%eax main+0xe: subl %eax,%esp main+0x10: movl $0,%eax ; 设置函数返回值0 main+0x15: leave ; 将ebp值赋给esp,pop先前栈内的上级函数栈的基地址给ebp,恢复原栈基址 main+0x16: ret ; main函数返回,回到上级调用 > 注:这里得到的汇编语言语法格式与Intel的手册有很大不同,Unix/Linux采用AT&T 汇编格式作为汇编语言的语法格式 如果想了解AT&T汇编可以参考文章:Linux AT&T 汇编语言开发指南问题:谁调用了main函数? 在C语言的层面来看,main函数是一个程序的起始入口点,而实际上,ELF可执行文件的入口点并不是main而是_start。 mdb也可以反汇编_start: > _start::dis ;从_start 的地址开始反汇编 _start: pushl $0 _start+2: pushl $0 _start+4: movl %esp,%ebp _start+6: pushl %edx _start+7: movl $0x80504b0,%eax _start+0xc: testl %eax,%eax _start+0xe: je +0xf <_start+0x1d> _start+0x10: pushl $0x80504b0 _start+0x15: call -0x75 _start+0x1a: addl $4,%esp _start+0x1d: movl $0x8060710,%eax _start+0x22: testl %eax,%eax _start+0x24: je +7 <_start+0x2b> _start+0x26: call -0x86 _start+0x2b: pushl $0x80506cd _start+0x30: call -0x90 _start+0x35: movl +8(%ebp),%eax _start+0x38: leal +0x10(%ebp,%eax,4),%edx _start+0x3c: movl %edx,0x8060804

河北工业大学汇编语言程序设计实验

汇编语言程序设计实验 网络*** *** 实验一 顺序与分支程序设计 一 、实验目的 1) 掌握顺序程序设计方法。 2) 掌握分支程序的结构及分支程序的设计,调试方法。 2) 学习数据传送及算术和逻辑运算指令的用法。 3) 熟悉在pc 机上建立、汇编、连接、调试和运行汇编语言程序的过程。 二、实验内容 1.实验六 从键盘上接收一位十进制数x ,计算y 值,并以十六进制形式显示出来,y 按下列公式计算。 ???????===-=+=) 6(2/) 5()4(2) 3(22 2 2X X X X X X X X X X Y 2..实验七 实验内容:从键盘上接收两个一位十六进制数x 和y ,然后再输入一个a-d 之间的一个字符,按下列要求计算。 a) 当输入字符为a ,则计算x+y ,并以十六进 制形式显示出来 b) 当输入字符为b ,则计算|x-y|,并以十六进制形式显示出来 c) 当输入字符为c ,则计算x*y ,并以十六进制形式显示出来 d) 当输入字符为d ,则计算x/y ,并以十六进制形式显示出来 三、实验代码 实验六 DATE SEGMENT X DB ?

DATE ENDS ;数据段 CODE SEGMENT ASSUME CS:CODE,DS:DATE START:MOV AX,DATE ;代码段 MOV DS,AX ;初始化ds寄存器 MOV AH,1 INT 21H ;读文件到缓冲区 CMP AL,33H ;比较指令 JB L0 ;A

汇编语言第四章答案

4.1 指出下列指令的错误: (1) MOV AH, BX ;寄存器类型不匹配 (2) MOV [BX], [SI] ;不能都是存储器操作数 (3) MOV AX, [SI][DI] ;[SI]和[DI]不能一起使用 (4) MOV MYDA T [BX][SI], ES:AX ;AX寄存器不能使用段超越 (5) MOV BYTE PTR [BX], 1000 ;1000超过了一个字节的范围 (6) MOV BX, OFFSET MYDA T [SI] ;MYDA T [SI]已经是偏移地址,不能再使用OFFSET (7) MOV CS, AX ;CS不能用作目的寄存器 (8) MOV ECX, AX ;两个操作数的数据类型不同 答:见注释。 4.2 下面哪些指令是非法的?(假设OP1,OP2是已经用DB定义的变量) (1) CMP 15, BX ;错,立即数不能作为目的操作数 (2) CMP OP1, 25 (3) CMP OP1, OP2 ;错,不能都是存储器操作数 (4) CMP AX, OP1 ;错,类型不匹配,应为CMP ax, word ptr op1 答:见注释。 4.3 假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列哪些指令是非法的?它们的错误是什么? (1) MOV BP, AL ;错,寄存器类型不匹配 (2) MOV WORD_OP [BX+4*3][DI], SP (3) MOV WORD_OP1, WORD_OP2 ;错,不能都是存储器操作数 (4) MOV AX, WORD_OP1[DX] ;错,DX不能用于存储器寻址 (5) MOV SA VE_WORD, DS (6) MOV SP, SS:DA TA_WORD [BX][SI] (7) MOV [BX][SI], 2 ;错,[BX][SI]未指出数据类型 (8) MOV AX, WORD_OP1+WORD_OP2 (9) MOV AX, WORD_OP1-WORD_OP2+100 (10) MOV WORD_OP1, WORD_OP1-WORD_OP2 答:见注释。 4.4 假设V AR1和V AR2为字变量,LAB为标号,试指出下列指令的错误之处: (1) ADD V AR1, V AR2 ;不能都是存储器操作数 (2) SUB AL, V AR1 ;数据类型不匹配 (3) JMP LAB [SI] ;LAB是标号而不是变量名,后面不能加[SI] (4) JNZ V AR1 ;V AR1是变量而不是标号 (5) JMP NEAR LAB ;应使用NEAR PTR 答:见注释。 4.5 画图说明下列语句所分配的存储空间及初始化的数据值。 (1) BYTE_V AR DB ‘BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?) (2) WORD_V AR DW 5 DUP(0,1,2),?,-5,‘BY’,‘TE’,256H 答:答案如下图所示。 4.6 试列出各种方法,使汇编程序把5150H存入一个存储器字中(如:DW 5150H)。 4.5题答案 42H

第四章汇编语言

4.1汇编语言概述 语言分机器语言、低级语言、高级语言,机器语言由0和1构成,只有专业人士才能看懂。低级语言就是汇编语言,用助记符来表示,最贴近机器硬件,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言高级语言分为面向过程和面向对象的语言。 1 顺序结构 顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。 2 分支结构 (1).分支程序设计概述 分支程序结构可以有两种形式,如图所示 (2)分支程序设计 分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。 3 循环程序设计 1.循环程序设计概述 有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。 循环程序一般由四个部分组成: (1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。 (2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。 (3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。 (4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。 4.2 汇编语言的语句 4.2.1语句分类:汇编语言语句分为指令性语句、伪指令、宏指令。 4.2.2语句格式:[标号] 操作码 [操作数] [注释] 汇编语言源程序中的每个语句可以由4项组成,格式如下 [name] operation operand [;comment] [名字项] 操作项操作数项;注释项 下面分别说明各项的表示方法。 1.名字项 源程序中用下列字符表示名字: 字母:A~Z或a~z; 数字:0~9; 专用字符号:?、?、@、―、$; 一般来讲,名字项可以是标号或变量。 (1)标号:在代码段定义,后面跟冒号:

汇编语言词法分析(新)

数学与信息工程学院《编译原理》 实验报告一 实验名称:词法分析 实验室:6202 班级:09计算机3班 姓名:沈春晖 学号:0929210062

词法分析器的设计 一、实验目的 通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、实验环境 操作系统:window xp 编写环境:visual c++ 、c-free、turbo c 编写语言:c语言 分析语言:PL/0 三、实验内容 对PL/0语言进行词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下: (1)关键字:begin,call,const,do,end,if,odd,procedure,read,then,var,while,write (2)标识符:用来表示各种名字,必须以字母开头小于10位字符组成(3)数字:以0-9组成小于14位的数字 (4)运算符:+,-,*,/,:=,<,<=,>,>= (5)界符:,,.,;,# 表1 各种单词符号对应类型表 单词符号类型 + plus - minus * times / slash ( lparen ) rparen = eql , comma . perio # neq ; semicolon begin beginsym call callsym const constsym do dosym end endsym

if ifsym odd oddsym procedure proceduresym read readsym then thensym var varsym while whilesym write writesym N N Y Y 开始 调用GETSYM 取单词 输入要分析的文件 文件是否存在 文件是否结束 结束 打印分析结果 图1 主流程图

Linux中的汇编语言

Linux中的汇编语言 在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S 为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成。有些汇编命令出现在以.c为扩展名的C文件中,在这种文件中,既有C语言,也有汇编语言,我们把出现在C代码中的汇编语言叫所“嵌入式”汇编。不管这些汇编代码出现在哪里,它在一定程度上都成为阅读源代码的拦路虎。 尽管C语言已经成为编写操作系统的主要语言,但是,在操作系统与硬件打交道的过程中,在需要频繁调用的函数中以及某些特殊的场合中,C语言显得力不从心,这时,繁琐但又高效的汇编语言必须粉墨登场。因此,在了解一些硬件的基础上,必须对相关的汇编语言知识也所有了解。 读者可能有过在DOS操作系统下编写汇编程序的经历,也具备一定的汇编知识。但是,在Linux的源代码中,你可能看到了与Intel的汇编语言格式不一样的形式,这就是AT&T的386汇编语言。 一、AT&T与Intel汇编语言的比较 我们知道,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事情都发源于Unix。就Linux所使用的386汇编语言而言,它也是起源于Unix。Unix最初是为PDP-11开发的,曾先后被移植到VAX及68000系列的处理器上,这些处理器上的汇编语言都采用的是AT&T的指令格式。当Unix被移植到i386时,自然也就采用了AT&T的汇编语言格式,而不是Intel的格式。尽管这两种汇编语言在语法上有一定的差异,但所基于的硬件知识是相同的,因此,如果你非常熟悉Intel的语法格式,那么你也可以很容易地把它“移植“到AT&T来。下面我们通过对照Intel与AT&T的语法格式,以便于你把过去的知识能很快地“移植”过来。

《汇编语言》实验

《汇编语言》课程实验指导手册 本实验指导手册旨在指导数学与软件科学学院信息与计算科学专业《汇编语言》(专业任选课)的实验教学活动过程。其主要使用对象为本课程主讲教师和实验指导教师。它可以作为教学过程中的教学辅助参考资料,也可以作为学生在本门课程的学习中,结合实际教学内容,完成相关实验并填写实验报告的主要依据。具体实施过程中,除开各实验中要求的必做题目外,教师可结合实际教学情况,根据学生接受程度作适当扩展。学生在进行实践设计活动时,也可以结合自身掌握和学习的实际情况进行有选择地实践。 本指导手册仅针对本学院信息与计算科学专业而设置。 本实验手册编写的参考书籍: 1.《IBM-PC汇编语言程序设计(第2版)》,沈美明温冬婵编著,北京:清华大学出版社,2001年8月(第2版)2005年6月第14次印刷 2.《80X86汇编语言程序设计教程》,杨季文等编著,北京:清华大学出版社,1998年6月(第1版)2005年8月第14次印刷 引言 汇编语言程序设计技术是实践性很强的课程。实践也是学好程序设计课程中必不可少的重要环节。程序设计的实践分两个步骤:一是设计和编写解决问题的程序算法流程,并在此基础上编写源程序代码;二是在计算机上对程序进行调试,并使程序完成问题的求解过程,进行相应的逻辑测试。由于汇编语言固有的特点,其程序调试比一般的高级程序语言困难,为此,学习过程中,尤其注意事先做好上机准备,做到目的明确,思路清晰,调试策略完全、全面,以便更好地观察和分析汇编程序执行的技巧,并注意领会计算机工作的本质过程和步骤。可以参阅计算机组成 原理方面的参考书,帮助理解计算机的基本工作原理。 实验过程中,应当注意如下问题: (1) 上机实习的主要目的是训练汇编语言程序的上机调试能力和分析、解决调试过程中遇到的问题的能力。并在此过程中逐步提高程序编写与问题分析能力。而不是简单地对教材上的实例做验证式的操作; (2) 上机内容可以结合教材内容和习题,或由老师布置专门的上机习题进行; (3) 为提高上机效果。必须在上机之前准备好上机的基本内容并编写好上机程

汇编语言实验报告

汇编语言程序设计实验报告 学院:计算机科学与技术 专业:计算机科学与技术 指导教师: ** 班级: ** 学号: ** 姓名:**

实验一集成环境及调试工具 一、实验题目 认识Tddebug集成操作软件 二、分析设计思想,绘制实验原理图、流程图 (一)、汇编语言程序的开发过程如图1.1所示,这个过程主要有编辑、编译、链接几个步骤构成。 图1.1 汇编语言程序开发过程 1、源程序的编辑 E: > EDIT TEST.ASM 编辑过程就是将源程序输入内存,生成一个扩展名为ASM的文本文件并存入硬盘。2、源程序的编译 E:>TASM TEST.ASM 编译也称为汇编,就是利用汇编器(如TASM或MASM)对源程序进行编译,生成扩展名为OBJ的目标文件。在编译过程中,检查语法错误,若有错,则不生成目标代码文件,并给出错误信息。根据错误信息应返回到编辑状态,修改源程序。 3、目标程序的链接 E:> TLINK TEST.OBJ 链接过程是利用链接程序(如TLINK或LINK)将用户目标程序和库文件链接、定位,生成扩展名为EXE的可执行文件。链接时,如果链接文件找不到所需要的链接信息,则发出错误信息,不生成可执行文件。 4、调试可执行程序 E:>TD TEST.EXE 如果生成的EXE文件运行后,并没有按照设计意图运行,就需要对程序进行调试,找出错误。再对源程序进行修改,即重复进行编辑、编译、链接、调试,直到生成完全正确的可执行文件为止。 (二)、Tddebug集成操作软件使用说明 1.该软件是集编辑(Edit.exe)、编译(Tasm.exe)、连接(Link.exe)和调试(TD.exe)

第四章--汇编语言程序设计

第四章汇编语言程序设计 1编程将片内40H?60H单元中的内容送到以3000H为首的存储区内。答:MOV R1,#40H MOV R2,#21H MOV DPTR,#3000H L1: MOV A,@R1 MOVX@DPT,R A INC R1 INC DPTR DJNZ R2,L1 2、编程计算下列算式的程序 1) 23H+45H+ABH+03H= MOV A , #23H ADD A , #45H ADD A , #0ABH XCH A ,B ;溢出处理 ADDC A , #00H XCH A ,B ADD A ,#03H;A中为结果低位,B中为高位 2) CDH+15H-38H-46H= MOV A,#0CDH ADD A,#15H SUBB A,#38H SUBB A,#46H 3) 1234H+8347H=

MOV A , #34H ADD A , #47H MOV 30H , A MOV A , #12H ADDC A , #83H MOV 31, A ;30H 存结果低位, 31H 存结果高位 4)AB123H-43ADCH= CLR C MOV A , #23H SUBB A , DCH MOV 30H , A MOV A , #0B1H SUBB A , #3AH MOV 31H , A MOV A , #0AH SUBB A ,, #04H MOV 32H , A ;30H 为低位, 32H 为高位 3、设有两个4位BCD 码,分别存放在 23H 22H 单元和33H 、32H 单元中,求他们的和,并 送入43H 、42H 单元中(低位在低字节,高位在高字节) 。 答: MOV A , 22H ADD A , 32H MOV 42H , A MOV A , 23H ADDC A , 33H MOV 43H , A

汇编语言常用语句一览

汇编语言常用语句一览 一、数据传输指令 ──────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1.通用数据传送指令. MOV传送字或字节. MOVSX先符号扩展,再传送. MOVZX先零扩展,再传送. PUSH把字压入堆栈. POP把字弹出堆栈. PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP交换32位寄存器里字节的顺序 XCHG交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX) XADD先交换再累加.(结果在第一个操作数里) XLAT字节查表转换.──BX指向一张256字节的表的起点,AL 为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL) 2.输入输出端口传送指令. IN I/O端口输入.(语法:IN累加器,{端口号│DX}) OUT I/O端口输出.(语法:OUT{端口号│DX},累加器) 输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX 指定时,其范围是0-65535. 3.目的地址传送指令. LEA装入有效地址.例:LEA DX,string;把偏移地址存到DX. LDS传送目标指针,把指针内容装入DS.例:LDS SI,string;把段地址:偏移地址存到DS:SI. LES传送目标指针,把指针内容装入ES.例:LES DI,string;把段地址:偏移地址存到ES:DI. LFS传送目标指针,把指针内容装入FS.例:LFS DI,string;把段地址:偏移地址存到FS:DI. LGS传送目标指针,把指针内容装入GS.例:LGS DI,string;把段地址:偏移地址存到GS:DI. LSS传送目标指针,把指针内容装入SS.例:LSS DI,string;把段地址:偏移地址存到SS:DI. 4.标志传送指令. LAHF标志寄存器传送,把标志装入AH. SAHF标志寄存器传送,把AH内容装入标志寄存器. PUSHF标志入栈.

《汇编语言程序设计》 实验指导书2012.5.24)

《汇编语言程序设计》课程实验指导书(Assembly Language Programming) 计算机科学与技术系 杨定安编写 佛山科学技术学院 2012 年 5 月

摘要 汇编语言实验主要使学生掌握DEBUG或DEB2000调试程序中各命令的使用方法,掌握MASM汇编程序对汇编语言源程序进行编辑、汇编、连接、装配、调试到运行的上机操作方法。本实验大纲要求学生熟练掌握汇编语言指令练习、顺序程序设计、分支程序设计、循环程序设计和子程序设计。

目录 实验一宏汇编程序(MASM)及汇编语言上机过程 (4) 实验二程序的基本结构练习 (8) 实验三汇编编译器的使用及程序调试 (11) 实验四分支程序设计 (17) 实验五循环程序设计 (19) 实验六子程序设计 (23) 实验七汇编语言与C语言混合程序设计 (29)

实验一宏汇编程序(MASM)及汇编语言上机过程 一、实验目的 1.通过实验了解和熟悉微机系统的配置。 2.学习在DEBUG状态下输入汇编源程序的方法。 3.初步掌握调试(在DEBUG状态下)的过程。 二、实验原理 1. 本实验要求在DEBUG状态下输入汇编源程序,并用DEBUG命令进行调试。用单步跟踪的方法验证指令的功能。 2. 以下是给定的参考程序,并在实验时在每条指令的“;”符号右边按要求填写指令的执行结果。 注:⑴微机进入DEBUG状态下之后,一切立即数和地址数据均被默认为十六进制数,在输入时数的后面不加后缀“H”; ⑵在DEBUG状态下执行程序时,“INT 20H”指令可使系统执行完该指令前的程序时返回到“-”提示符状态,并且恢复CS和IP寄存器原来的值。 三、实验仪器 微机一台,U盘一块。 四、实验步骤 1.开机和关机操作顺序 开机:先打开微机外部设备电源开关,如显示器,最后打开主机电源开关。 关机:与开机相反,先关掉主机电源开关,然后关闭所有外设的电源开关。 2. 装入DEBUG程序 若计算机系统启动正常,可以进入MASM文件夹或MASM5文件夹从磁盘上调用DEBUG,程序到内存。如是WINDOWS环境下,先运行CMD命令,然后运行CD MASM命令,再运行DEB2000命令。一般C盘上装有DEBUG和DEB2000软件,若没有,可以用复制命令从其它盘拷贝过来,然后从装有DEBUG和DEB2000软件的磁盘上调用DEBUG和DEB2000软件程序。例如: C :\MASM> DEB2000↙(↙回车符) -(-DEBUG 提示符) 当显示器出现提示符“-”时,说明已进入DEBUG状态,这时,可用DEBUG命令进行操作。 4. 用DEBUG的Register命令检查所有寄存器内容,并作记录。命令格式: R [寄存器名] 检查和修改寄存器内容的命令R,它有三种方式: 1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R R命令显示中标志位状态的含义如下表所示: 标志名置位复位