文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言

汇编语言

汇编语言
汇编语言

4.1 概述

汇编语言源程序

机器语言:二进制数形式的指令和数据。

助记符:用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。

汇编语言:指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。

用汇编语言编写的程序叫汇编语言源程序。

汇编程序

汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。

高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。

汇编语言程序设计与执行过程

输入汇编语言源程序--->源文件 .ASM

汇编(编译)--->目标文件 .OBJ

链接--->可执行文件 .EXE

调试--->最终程序

4.1.1 汇编语言源程序的结构

汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:

数据段—存放数据、变量

堆栈段—堆栈区域

代码段—存放程序指令

一个基本的汇编语言程序框架:

stack SEGMENT PARA 'stack'

DB 100 DUP('stack’)

stack ENDS

data SEGMENT

<数据、变量在此定义>

data ENDS

code SEGMENT

ASSUME CS:code, DS:data, ES:data

start: MOV AX, data

MOV DS, AX

MOV ES, AX

<此处加入你自己的程序段>

MOV AL, 4CH

INT 21H

code ENDS

END start

4.1.2 汇编语言语句类型及格式汇编语言的语句有两种:

指令性语句:由8086指令助记符构成的语句

格式为:

标号: 指令助记符目的操作数,源操作数 ;注释

指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应;

指令性语句汇编时生成机器码

指示性语句:由伪指令构成的语句

格式为:

名字伪指令操作数1,操作数2,…,操作数n ;注释

注:各部分之间至少要用一个空格作为分隔符。

指示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。

指示性语句汇编时不生成机器码

语句的构成元素:

标号:指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。

名字:段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。

指令助记符:8086助记符、伪指令

操作数:即指令的操作对象

–对指令性语句——0,1,2个

–对指示性语句——根据需要而定

–操作数之间以逗号分隔

–操作数可以是:寄存器、存储单元、常数或表达式

注释:以分号开头,可放在指令后,也可单独一行。

4.1.3 数据项与表达式

数据项包括常量、变量、标号及表达式。

常量

?二进制数,以B结尾。

如01001101B。

?十进制数,

如85。

?十六进制数,以H结尾。

第1个数字为A-F时,前面应加0,如0F160H。

?字符串:用引号括起来的1个或多个字符。

如‘ERROR!’, ’a’,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H和61H。

标号:指令所在内存单元的符号地址指令性语句

有三个属性:

?段地址:即标号所在段的段地址;

?偏移量:标号所代表存储单元的段内偏移地址;

?类型:NEAR或FAR:

NEAR—表示标号所在语句与转移指令/调用指令在同一码段内,跳转时只需改变IP即可。

FAR—标号所在语句与转移指令/调用指令不在同一代码段内。

若没有对类型进行说明,默认为NEAR。

标号通常作为转移指令或CALL指令的转移地址。

变量:即内存中的存储单元或数据区

变量名:是存储单元(数据区)的符号地址或名字。

变量也有三个属性:

?段地址—变量所在段的段地址

?偏移量—变量单元地址与段首地址之间的位移量。

?类型—有BYTE、WORD和DWORD三种。

变量在程序中作为存储器操作数被引用。

标号和变量名的使用规则

?组成:A-Z(不分大小写), 0-9, ?@ . _ $

?不能以数字开头,句号(.)只能作为首字符

?长度小于31个字符

?不能与保留字(指令助记符、伪指令、预定义符号等)重名

?不能重复定义

例如:正确的:LP1, AGAIN, NEXT, _GO, OK_1

错误的:4M, LOOP, AAA, #HELP, +ONE

表达式:常数、寄存器、标号、变量与运算符的组合。

有数字表达式和地址表达式两种。

汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。

表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。

算术运算符—— +、-、*、/,MOD

?用于数字表达式,

例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096

?用于地址表达式,

例: LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为: LEA SI,[1003H]

逻辑运算符—— AND、OR、XOR、NOT

逻辑运算符只能用于数字表达式中。

例:MOV CL,36H AND 0FH 经汇编后:MOV CL,06H

注意,不要把逻辑运算符与逻辑运算指令混淆:

例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与AND AX, 3F00H 等价。

关系运算符——EQ、NE、LT、GT、LE、GE

关系运算的结果是一个逻辑值:真或假

关系为真,结果为全1;关系为假,结果为全0

例:MOV BX,PORT GT 300H

若PORT的值大于300H,则汇编后为: MOV BX,0FFFFH 否则汇编后为: MOV BX,0

取地址运算符——SEG、OFFSET

?SEG:取变量/标号的段地址

?OFFSET:取变量/标号的偏移地址

例:VAR DB 12H

……

MOV BX,OFFSET VAR ;取变量VAR的偏移地址

MOV AX,SEG VAR ;取变量VAR的段地址

注意,以下指令的异同:

MOV BX, OFFSET VAR;OFFSET指令只能取静态的偏移地址

LEA BX, VAR OFFSET;LEA指令即可取静态的偏移地址,也可取动态的偏移地址。

取值运算符——TYPE、LENGTH、SIZE

?TYPE 取变量的类型(1,2,4)

?LENGTH 取所定义变量的长度(即变量中元素的个数)

?SIZE 取所定义存储区的字节数(=TYPE*LENGTH) VAR = 10

例:VAR DW 1,2,3,4,5 则 TYPE VAR = 2 LENGTH VAR = 5 SIZE

属性运算符——PTR

用来指定地址操作数的类型。

格式:<类型> PTR <地址操作数>

类型∈{BYTE, WORD, DWORD, NEAR, FAR}

?BYTE、WORD、DWORD 用于描述数据存储单元(变量)地址

?NEAR、FAR 用于描述转移、调用的目的地址

例:MOV BYTE PTR[DI],0 ;字节类型

MOV WORD PTR[DI],0 ;字类型

MOV [DI],0B5H ;类型不定

PTR也可用来进行强制类型转换

例:STR1 DW ? ;STR1定义为字类型

MOV AX,STR1 ;合法

MOV AL,STR1 ;非法

MOV AL,BYTE PTR STR1 ;合法

4.2.1 数据定义伪指令

用于定义变量,即内存单元或数据区。

数据定义伪指令的格式:

变量名数据定义伪指令操作数,操作数,…

操作数可以是常数、变量或表达式

常用的数据定义伪指令有如下几种:

?DB 定义字节

?DW 定义字

?DD 定义双字

4.2.2 符号定义伪指令

把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。

类似于C语言中的#define。

符号定义伪指令有两种:EQU,=

?用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。

?用”=”定义的符号可在任何时候进行重定义。

二者均不占用存储空间,仅是给符号赋值

例:FIVE EQU 5

COUNT EQU CX

TEN EQU 10

DIST = BYTE PTR[SI+BP]

GOTO = JMP

MOV AX, TEN

MOV CX, COUNT

ADD DIST, FIVE

DIST = WORD PTR[SI+BP+1]

ADD DIST, AX

GOTO LABEL

4.2.3 段定义伪指令

汇编语言程序是按段来组织程序和数据的。和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。

三类段:代码(程序)、数据、堆栈

段定义伪指令:SEGMENT、ENDS、ASSUME、ORG

定义一个段的基本格式:

段名 SEGMENT [定位类型][组合方式][类别]

<汇编语言语句>

段名 ENDS

SEGMENT和ENDS伪指令

这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。

对数据段和堆栈段,段中的语句一般是变量定义。对代码段则是指令语句。如: data SEGMENT

<指令语句>

data ENDS

SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。

1) 定位类型:说明如何确定逻辑段的边界。有四种:

?PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或段起始物理地址应为××××0H。——默认类型

?BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。

?WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。

?PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为×××00H。

2) 组合类型:说明不同模块中同名段的组合方式。

?PUBLIC : 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。

?COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。

?AT <数值表达式> : 按绝对地址定位,段地址就是表达式的值。

?STACK : 专用于说明堆栈段,组合方式同PUBLIC

3) 类别:用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。

如在模块1中有段定义:

seg1 SEGMENT PARA STACK ‘stack’

seg1 ENDS

在模块2中有段定义:

seg2 SEGMENT PARA STACK ‘stack’

seg2 ENDS

则连接时这两个段被安排在一起。

ORG伪指令

ORG规定了段内的指令或数据存放的开始地址(偏移地址的初值),其格式为:ORG <表达式>

表达式的值即为开始地址,从此地址起连续存放程序或数据。

例: ABC SEGMENT

ORG 100H

begin: ;指令从100H开始存放

… …

ABC ENDS

4.2.4 设定段寄存器伪指令

在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句来指定。

如 ASSUME CS:code, DS:data, ES:data

语句中的code和data为段名。

这个语句说明:

1. CS将指向名字为code的代码段

2. DS和ES将指向名字为data的数据段。

但要注意,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句将段基址装入段寄存器。

MOV AX,DATA

MOV DS,AX

MOV ES,AX

如果程序中用到堆栈段,则SS也需装入实际的初值。

代码段基地址不需要程序员装入CS寄存器,而由OS负责装入。

4.2.5 过程定义伪指令

过程就是子程序。

一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。

过程定义伪指令的格式:

<过程名> PROC [类型]

… …

RET

<过程名> ENDP

注意:PROC和ENDP必须成对出现。

过程的类型有两种:

?NEAR——(默认类型)表示段内调用

?FAR——表示段间调用

调用一个过程的格式:

CALL <过程名>

4.2.6 宏命令伪指令

如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。

宏指令的格式:

<宏指令名> MACRO [形参表]

<宏定义体>

ENDM

例:两个数之和的宏定义和宏调用。

宏定义为:

DADD MACRO X,Y,Z ;X、Y、Z是形式参数

MOV AX,X

ADD AX,Y

MOV Z,AX

ENDM

调用宏DADD时可写:

DADD DATA1,DATA2,SUM DATA1,DATA2

SUM是实际参数,由它们替换定义中的X、Y、Z。

宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是:?执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行的指令。

?汇编结果:宏命令伪指令汇编后被展开。

?执行速度:宏命令执行速度较快(因无调用转移)

?占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。

宏展开:汇编程序会把宏调用按宏定义展开。

4.2.7 模块定义与连接伪指令

汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。

格式:

END [表达式]

END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。

4.3 DOS功能调用

系统功能调用:由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。

系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。

用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INT n来实现。在DOS系统中,功能调用都是用软中断指令INT 21H来实现的。

INT 2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它。

D0S系统功能调用的使用方法如下:

?AH←功能号;

?设置该功能所要求的其他入口参数;

?执行INT 21H指令;

?分析出口参数。

以下介绍INT 21H的几个最常用的功能:

关于数据输入和输出我们这里只讨论键盘输入和显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。

1. DOS键盘功能调用

(1) 从键盘输入一个字符(功能号=1)

MOV AH,1

INT 21H

[例1]

(2) 输入字符串(功能号=0AH)

此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。

MOV AH, 0AH

LEA DX, <字符串缓冲区首地址>

INT 21H

用户定义的输入字符串的缓冲区格式:

N1: 缓冲区长度(最大键入字符数)

N2: 实际键入的字符数(不包括回车符)

若用户键入的字符数(包括回车)≥定义的N1,本功能调用将不再接收新的键入,且光标不再向右移动。

[例2]

2. DOS显示功能调用

(1) 在显示器上显示一个字符(功能号=2)

MOV AH, 2

MOV DL, <要显示的字符>

INT 21H

[例3]

(2)显示字符串(功能号=9)

MOV AH, 9

LEA DX, <字符串>

INT 21H

注意:被显示的字符串必须以’$’结束。

4.4.1 程序设计概述

1.程序质量的评价标准

?程序的正确性和完整性

?程序的易读性

?程序的执行时间和效率

?程序所占内存的大小

2.汇编语言程序设计的步骤:

?根据实际问题抽象出数学模型,确定算法

?画出程序框图(流程图)

?分配内存工作单元和寄存器

?根据框图编写源程序,存成.ASM文件

?对源程序汇编,生成.OBJ目标文件

?把.OBJ文件连接成.EXE执行文件

?运行、调试

绘制程序框图(流程图):

?用方框表示工作框,框中用简明语言标明要完成的功能

?用菱形框表示判断框,框中标明比较、判断和条件

?用带边框的方框表示调用子程序或过程,框中标明子程序名字(入口参数等)

?各框之间用直线连起来表示程序走向。

汇编语言程序上机过程:

3.源程序的基本结构:顺序、分支、循环、过程

4.4.3 分支程序

由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:IF…THEN结构

程序结构:

测试/比较指令 (TEST/CMP)

条件转移指令 (Jx 标号)

处理体

标号: 其他指令

IF…THEN…ELSE结构

程序结构:

TEST/CMP指令

Jx 标号1

处理体P1

JMP 标号2

标号1:处理体P2

标号2:其他指令…

CASE结构

程序结构:

TEST/CMP指令(测试条件1) Jx 标号1 ;不满足转标号1 处理体P1…

JMP 标号n+1

标号1: TEST/CMP指令(测试条件2) Jx 标号2 ;不满足转标号2

处理体P2…

JMP 标号n+1

标号2: TEST/CMP指令(测试条件3)

Jx 标号3 ;不满足转标号3

处理体P3…

JMP 标号n+1

标号3: TEST/CMP指令(测试条件4)

标号n+1:(公共出口)

4.4.4 循环程序

由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:DO…UNTIL<条件> 结构

先执行,再判断条件。工作部分至少执行一次。

DO WHILE<条件> 结构

先判断条件,再执行。工作部分有可能一次都不执行。

注意:循环可以嵌套(多重循环),但多个循环体之间不能交叉,控制条件不能混淆。

[例]冒泡法排序

4.4.5 子程序设计

掌握以下几点:

?调用子程序用CALL指令,返回调用程序用RET指令。

?子程序允许嵌套调用。

?进入子程序后首先要保护主程序的运行状态(标志位)和使用的寄存器内容(称为保护现场),退出子程序前要恢复现场。

?调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存储单元或堆栈(要用BP寻址)。

4.5 常见程序设计举例

1.码制转换

十、二进制数、ASCII码之间的互相转换。

①BCD数→二进制数

算法:

Dn-1*10n-1+……+D0*100 = (…(Dn-1*10+ Dn-2)*10+…)*10+ D0

= (…((0*10+Dn-1)*10+ Dn-2)*10+…)*10+ D0

即:新的中间结果 = 中间结果*10+本位数字 (中间结果初值为0)

[例1]

[例2]

②ASCII码→二进制数(用于输入)

算法:

ASCII→BCD→二进制数

?ASCII→BCD码很简单,高4位清零即可得到非压缩的BCD码。

?BCD→二进制数可以采用用以下方法:

((((0+千位数)*10+百位数)*10)+十位数)*10+个位数

第一次处理(0+千位数)*10;

第二次处理((0+千位数)*10+百位数)*10

第三次处理(((0+千位数)*10+百位数)*10)+十位数)*10

第四次处理((((0+千位数)*10+百位数)*10)+十位数)*10+个位数

[例3]

③二进制数→BCD

算法1:

计算二进制数中所包含的1000的个数、100的个数、10的个数和1的个数。

汇编语言实现十进制加减计算器

课程设计 题目十进制数加减计算器学院计算机科学与技术 专业计算机科学与技术 班级计算机0808班 姓名何爽 指导教师袁小玲 2010 年12 月31 日

课程设计任务书 学生姓名:何爽专业班级:计算机0808班 指导教师:袁小玲工作单位:计算机科学与技术学院 题目: 十进制数加减计算器的设计 初始条件: 理论:学完“汇编语言程序设计”、“课程计算机概论”、“高级语言程序设计”和“数字逻辑”。 实践:计算机学院科学系实验中心提供计算机和软件平台。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)十进制数加减计算器的设计。 (2)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。 (3)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。 (4)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 在正文第一行写课程设计题目; 1.需求说明(要求、功能简述)或问题描述; 2.设计说明(简要的分析与概要设计); 3.详细的算法描述; 4.源程序与执行结果(含测试方法和测试结果); 5.使用说明; 6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该 程序进一步改进扩展的设想)。 时间安排: 设计时间一周:周1:查阅相关资料。 周2:系统分析,设计。 周3~4:编程并上机调试。 周5:撰写课程设计报告。 设计验收安排:20周星期五8:00起到计算机学院科学系实验中心进行上机验收。 设计报告书收取时间:20周的星期五下午5:00之前。 指导教师签名: 2010年12月31日 系主任(或责任教师)签名: 2010年12月31日

《汇编语言》在线作业二

请同学及时保存作业,如您在20分钟内不作操作,系统将自动退出。 《汇编语言》在线作业二 一、单选题(共 20 道试题,共 100 分。) V 1. 在多重循环程序中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B )。 A. 不必考虑 B. 必须重新设置 C. 必须置1 D. 须清0 满分:5 分 2. 伪指令是(C)规定的汇编说明符,它在源程序汇编时进行说明。 A. DEBUG B. LINK C. MASM D. EDIT 满分:5 分 3. 下列描述正确的是(D)。 A. 在多重循环程序中,内层循环只能有一个 B. 在汇编语言程序设计中,二重循环程序之间的关系可以交错 C. 在汇编语言程序设计中,每次循环应返回到置初值部分之前 D. 在汇编语言程序设计中,每次循环应返回到置初值部分之后 满分:5 分 4. 下列指令会影响标志位的指令是(D)。 A. JMP L

B. JC L C. MOV AL,L D. SHL AL,1 满分:5 分 5. LINK命令执行后可以生成一个以(B)为扩展名的文件。 A. ASM B. EXE C. OBJ D. COM 满分:5 分 6. 如果0100H单元存放条件转移指令的操作码,0101H单元存放条件转移指令的相对位移量 13H,那么转移后的指令的偏移地址为(C)。 A. 0102H B. 0113H C. 0115H D. 00FEH 满分:5 分 7. 若DS=1000H,BX=2000H,(12000H)=56H,(12001H)=78H,AX=1000H,执行“ADD AX,[BX]”指令后,AX=(A)。 A. 8856H B. 6678H C. 8800H D. 6600H 满分:5 分 8. 下列叙述正确的是(A )。 A. 执行一条段间调用指令,先将CS、IP的内容压栈,然后将目的地址送CS和IP。 B. 执行一条段间调用指令,先将目的地址送CS和IP,然后将CS、IP的内容压栈。

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

汇编语言程序设计期末考试试卷及参考答案

【汇编语言程序设计】期末考试-试卷及参考答案

执行上述两条指令后,正确的结果是( B )。 A.(AX)=1001H; B.(AX)=0FFFH; C.(AX)=1000H; D.(AX)=0111H。 6.串指令中的目的操作数地址一定是由____A_ _提供。()A.ES:[DI] ; B.SS:[BP]; C.DS:[SI] ; D.CS:[IP]。 7.将DX的内容除以2,正确的指令是( C )。 A.DIV 2 ; B.DIV DX,2 ; C.SAR DX,1; D.SHL DX,1。 8. 用户为了解决自己的问题,用汇编语言所编写的程序,称为( B )。 A.目标程序; B.汇编语言源程序; C.可执行程序; D.汇编程序。 9.用一条指令仅实现将AX←BX+SI的方法是( D )。 A.XCHG AX,[BX][SI] ; B.MOV AX,[BX+SI]; C.LEA AX,BX[SI] ; D.LEA AX,[BX][SI]。 10.设SP初值为2000H,执行指令“PUSH AX”后,SP的值是( C )。 A.1FFFH; B.1998H; C.1FFEH; D.2002H。 2. C 二、指出下列指令的出错原因,并改正。(每小题2分,共12分) 1.MOV BX,DL;操作数类型不匹配,改正为:MOV BL,DL 或MOV BX,DX 2.MOV CS,AX;代码段寄存器CS不能作目的操作数,改正为MOV DS,AX 3.ADD AX,DS;段寄存器DS的内容不能作为加法指令的操作数,改正为 MOV BX,DS ADD AX,BX 4.TEST BX,[CX];不能使用CX实现寄存器间接寻址,改正为 MOV SI,CX TEST BX,[SI] 5.SUB [BX],[BP+SI];两个操作数不能同为存储器操作数,且两个操作数的数据类型不确定,改正为:MOV AX,[BX] SUB AX,[BP+SI] 或:MOV AL,[BX] SUB AL,[BP+SI] 6.SHL DX ;没有给出移位次数,改正为SHL DX,1或 SHL DX,CL 三、程序填空题(注意:每空只能填一条指令,并注释说明所填指令的作用!每空3分,共18分) 1.在表TABLE处存放着N个无符号字节数,求表中前10个字节数的总和并

C语言与汇编语言互相调用

浅谈C程序中调用汇编模块的方法 C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外,还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的目标代码质量较高且执行的速度较快等。所以在工程上对硬件处理速度要求不很高的情况下,基本可以用C代替汇编语言,编写接口电路的控制软件。但C也不能完全取代汇编语言,如在一些对速度要求很高的实时控制系统中,以及对硬件的特殊控制方面,C有时也不能完全很好胜任,还需要汇编语言来编写。因为汇编语言目标代码更精练,对硬件直接控制能力更强和执行速度更快,但汇编语言编程烦难、表达能力差也显而易见。比较好的解决办法是C与汇编语言混合编程,即用C编写软件的调度程序、用户界面以及速度要求不高的控制部分,而用汇编语言对速度敏感部分提供最高速度的处理模块,供C调用。这种方法提供了最佳的软件设计方案,做到了兼顾速度效率高和灵活方便。由于本人的毕业设计需要C 程序中调用汇编模块的方法来提高ARM定点指令的执行速度,故对这方面进行了学习。学习心得如下: 对于C和汇编语言的接口主要有两个问题需要解决。 一、调用者与被调用者的参数传递 这种数据传递通过堆栈完成,在执行调用时从调用程序参数表中的最后一个参数开始,自动依次压入堆栈;将所有参数压入堆栈后,再自动将被调用程序执行结束后的返回地址(断点)压入堆栈,以使被调程序结束后能返回主调程序的正确位置而继续执行。例如一调用名为add汇编程序模块的主函数:main( ){...... add(dest,op1,op2,flages);......}。在此例中对主函数进行反汇编,主函数在调用add函数前自动组织的堆栈。 . . . lea 0xfffffffe8(%ebp),%eax #flages数组的首地址入栈 push %eax pushl 0xfffffff8(%ebp) #OP2入栈 pushl 0xfffffffc(%ebp) #OP1 入栈 pushl 0xfffffff0(%ebp) #dest地址入栈 call 0x80483f0 #调用add函数 . . 执行完add调用语句后,栈内数据结果如图一所示。 进入汇编子程序后,为了能正确获取主调程序并存入堆栈中的数据,被调的汇编子程序先后要做如下一些工作: 1、保存esp的副本 进入汇编子程序后,子程序中免不了要有压栈和出栈的操作,故ESP时刻在变化。为了能用ESP访问堆栈中的参数,安全办法是一进入子程序后,先为ESP制副本,以后对传递参数的访问都用副本进行。一般可用EBP保存ESP,如: push %ebp mov %ebp,%esp

32位80x86汇编语言ptr指令学习笔记

阅读反汇编后的汇编程序挺麻烦,尤其是在c语言程序的子函数参数中有数组参数,同时当子函数里有循环操作时,反汇编后的代码中频繁出现ptr指令操作。该指令的用法十分灵活,有时候读入(或写入)的是某内存地址,有时候读入(写入)的是某内存地址中存储的值,初学时总感觉很迷惑,分不清什么时候读内存地址,什么时候读内存地址中值,参考相关文献和书籍后作如下总结。 例如一段简单的C语言程序: int mywork(int a[9], int b[9], int c[9]) { int i; for ( i=0; i<9; i++) c[i] =a[i] +b[i]; } 这段代码debug版反汇编后代码很简单,但是里面有许多小细节值得推敲。 int mywork(int a[9], int b[9], int c[9]) ;原c代码 … … ;这里为开始调用函数时当前寄存器数据保存 for ( i = 0 ; i < 9 ; i ++) mov dword ptr [i], 0;这里为i初始化,值为0 jmp mywork+xx1h ;进入循环体内部 mov eax, dword ptr [i]; add eax, 1 mov dword ptr [i], eax mywork+xx1h:cmp dword ptr [i], 9 jge mywork+xx2h ;如果i等于或大于9,跳出循环 c[i] =a[i] +b[i]; mov eax, dowrd ptr [i] ;读入参数i mov ecx, dword ptr [a] ;这里是读入参数数组a的首地址 mov edx, dword ptr [b] ;这里是读入参数数组b的首地址 mov eax, dword ptr [ecx + eax*4] ;读入a add eax, dword ptr [edx +eax*4] ; eax = a[i]+b[i] mov edi, dword ptr [c] ;这里是读入参数数组c的首地址 mov dword ptr [edi+ eax*4], eax ;这里保存计算结果,c[i]= a[i]+b[i] inc eax jmp mywork+xx1h mywork+xx2h: … … ;一些数据恢复操作,主要是出栈等 ret 文中用红色标记处两处涉及ptr指令的地方。 第一处为mov eax, dword ptr [i] 本条mov指令的结果是将变量i的值读入到eax寄存器中,至于从i变量存储地址处读取几个字节,由dword修饰符指定(4个字节)。 第二处为mov ecx, dword ptr [a] 这里表示将参数数组a的首地址读入到ecx寄存器中。 同样两个mov 寄存器, dword ptr [变量]操作,为何第一个寄存器eax读入数值,而第二个ecx寄存器读入的为地址呢?

汇编语言-期末考试-试题讲课教案

一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.CPU要访问的某一存储单元的实际地址称() A.段地址B.偏移地址 C.物理地址D.逻辑地址 2.某存储单元的物理地址是12345H,可以作为它的段地址有() A.2345H B.12345H C.12340H D.1234H 3.执行后使BX=0的同时也使CF=0,OF=0的指令是() A.XOR BX,BX B.OR BX,BX C.AND BX,BX D.CMP BX,BX 4.循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是() A.CX≠0且ZF=1B.CX≠0且ZF=0 C.CX≠0或ZF=1D.CX≠0或ZF=0 5.在执行DAA指令,当高四位BCD码校正时产生进位,如要把此进位值送入AH中,对这进位值的操作应是() A.DAA校正指令的功能已自动加在AH中 B.进位值在AF中,校正后根据AF内容再加在AH中 C.进位值在CF中,校正后根据CF内容再加在AH中 D.进位值在AL最高位上,校正后根据AL最高位内容再加在AH中 6.AND,OR,XOR,NOT为四条逻辑运算指令,下面的解释正确的是() A.指令XOR AX,AX执行后,AX内容不变,但设置了标志位 B.指令OR DX,1000H执行后,将DX最高位置1,其余各位置0 C.指令AND AX,OFH执行后,分离出AL低四位 D.NOT AX,执行后,将AX清0 7.在执行下列指令时,需要使用段寄存器DS的指令是() A.STOSW B.ADD AL,CL C.NEG BX D.INC DA[BX] 8.无论BH中原有的数是奇数或偶数,若要使BH中的数一定为奇数,应执行的指令是()A.ADD BH,01H B.OR BH,01H C.XOR BH,01H D.TEST BH,01H 9.完成对CL寄存器的内容乘以4的正确操作是() A.ROL CL,1B.MUL4 ROL CL,1 C.SHL CL,1D.MOV CL,2 SHL CL,1SHL CL,CL 10.下面各传送指令中,正确的是() A.MOV[DI],[SI]B.MOV[DX+DI],AL C.MOV WORD PTR[BX],0100H D.MOV AL,BX 11.汇编语言语句格式中对名字项的规定如下,请找出其中错误的说法() A.名字的第一个字符可以是大写英文字母及小写英文字母 B.名字的第一个字符可以是字母、数字及、@、_ C.名字的有效长度≤31个字符 D.在名字中不允许出现$

汇编语言实现十个数的排序

DATAS SEGMENT DATA0 DB'Please input a numbers (0-65535):','$' DATA1 DB' over flow input again:','$' DATA2 DB'The num you have put is:',0ah,0dh,'$' DATA3 DB'After exchange the num is:',0ah,0dh,'$' DATA4 DB' ','$' DATA DW 10 DUP(?) DATAS ENDS STACKS SEGMENT DW 256 DUP(?);此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DA TAS,SS:STACKS ;/****************************************/ ;-----------程序开始------------ START: MOV AX,DA TAS MOV DS,AX MOV SI,0 MOV CX,10 ;----------循环输入------------ L: CALL INPUT ADD SI,2 CALL NEWLINE LOOP L MOV DX,OFFSET DATA2 MOV AH,9 INT 21H ;-------输入后显示---------- MOV CX,10 MOV DI,0 AGAIN: CALL PRINT CALL SPACE ADD DI,2 LOOP AGAIN ;----------排序-------------

MOV CX,9 MOV DI,0 LOOP0: CALL SORT ADD DI,2 LOOP LOOP0 CALL NEWLINE MOV DX,OFFSET DATA3 MOV AH,9 INT 21H ;----------交换后显示------------- MOV CX,10 MOV DI,0 AGAIN0: CALL PRINT CALL SPACE ADD DI,2 LOOP AGAIN0 ;----------返回系统-------------- EXIT: MOV AH,4CH INT 21H ;/**************************************/ ;------------输入函数-------- INPUT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX ;----------提示信息---------- MOV DX,OFFSET DATA0 MOV AH,9 INT 21H MOV BX,0 ;BX存放十进制数 CLC MOV DX,0

浅谈计算机编程语言的发展

浅谈计算机编程语言的发展 信息学院103班潘红10263210 摘要:一九九三年美国的克林顿政府提出了“信息高速公路”计划,从而在这十多年间在全球范围内引发了一场信息风暴,信息技术几乎触及了现代生活的方方面面,毫不夸张的说没有了信息技术,现代文明的生活将无从谈起;作为信息技术中最重要的部分,计算机技术无疑是其发展的核心问题,而我们知道计算机只是一台机器,它只能按照计算机语言编好的程序执行,那么正确认识计算机语言的过去和未来,就是关系到计算机发展的重中之重。1.引言 在计算机科学中,编程语言是用来编写可被计算机运行的一系列指令(计算机程序)的人工语言,于英语等自然语言相类似,编程语言具有词汇、语法和句法。然而,自然语言不适合计算机编程,因为它们能引起歧义,也就是说它们的词汇和语法结构可以用多种方式进行解释。用于计算编程的语言必须具有简单的逻辑结构,而且它们的语法、拼写和标点符号的规则必须精确。 2.计算机编程语言的发展历史 二十世纪四十年代当计算机刚刚问世的时候,程序员必须手动控制计算机。当时的计算机十分昂贵,唯一想到利用程序设计语言来解决问题的人是德国工程师楚泽(konrad zuse)。几十年后,计算机的价格大幅度下跌,而计算机程序也越来越复杂。也就是说,开发时间已经远比运行时间来得宝贵。于是,新的集成、可视的开发环境越来越流行。它们减少了所付出的时间、金钱(以及脑细胞)。只要轻敲几个键,一整段代码就可以使用了。这也得益于可以重用的程序代码库。随着c,pascal,fortran,等结构化高级语言的诞生,使程序员可以离开机器层次,在更抽象的层次上表达意图。由此诞生的三种重要控制结构,以及一些基本数据类型都能够很好的开始让程序员以接近问题本质的方式去思考和描述问题。随着程序规模的不断扩大,在60年代末期出现了软件危机,在当时的程序设计模型中都无法克服错误随着代码的扩大而级数般的扩大,以至到了无法控制的地步,这个时候就出现了一种新的思考程序设计方式和程序设计模型-----面向对象程 序设计,由此也诞生了一批支持此技术的程序设计语言,比如eiffel,c++,java,这些语言都以新的观点去看待问题,即问题就是由各种不同属性的对象以及对象之间的消息传递构成。面向对象语言由此必须支持新的程序设计技术,例如:数据隐藏,数据抽象,用户定义类型,继承,多态等等。 3.计算机编程语言的发展现 目前通用的编程语言有两种形式:汇编语言和高级语言。 2.1汇编语言 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。计算机编程人员用汇编语言使机器语言程序编写起来更简单一些。在汇编语言中,每条语句大致对应一条机器语言指令。汇编语言的语句是借助易于记忆的命令编写的。在典型的汇编语言

《汇编语言程序设计》在线测试

《汇编语言程序设计》第01章在线测试 《汇编语言程序设计》第01章在线测试剩余时间:59:54 答题须知:1、本卷满分20分。 2、答完题后,请一定要单击下面的“交卷”按钮交卷,否则无法记录本试卷的成绩。 3、在交卷之前,不要刷新本网页,否则你的答题结果将会被清空。 第一题、单项选择题(每题1分,5道题共5分) 1、一个字节的二进制位数是____位。 A、4 B、8 C、16 D、32 2、微机中每个存储单元具有一个地址,其中存放一个____量。 A、比特(1位) B、字节(8位) C、字(16位) D、双字(32位) 3、设段地址为5788H,偏移地址为94H,该字节的物理地址_____。 A、57974H B、5883H C、58ECH D、57914H 4、汇编语言源程序中,每个语句由4项组成,不影响语句功能的是_____。 A、名字项 B、助记符(操作码) C、操作数 D、注释 5、执行INT 21H指令后,8086CPU将转入_____号中断服务程序。 A、20 B、20H C、21 D、21H 第二题、多项选择题(每题2分,5道题共10分) 1、如下________名称属于8086的16位通用寄存器。 A、IP B、DS C、BP D、DX E、AX 2、采用汇编语言进行程序开发,可以使用的工具软件有______。 A、文本编辑程序 B、汇编程序 C、调试程序 D、集成化开发环境 E、连接程序 3、使用MASM 6.x版本的“ML /Fl eg101.asm”命令,如果源程序eg101.asm没有语法错误,则将生成_________文件。 A、目标代码文件

ARM中C语言调用汇编语言方法浅析

ARM中C语言调用汇编语言方法浅析在嵌入式系统开发中,目前使用的主要编程语言是C 和ARM指令汇编。在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。 一、在C语言中内嵌汇编 在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面: ①不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令; ②在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突; ③R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器; d 一般不要直接指定物理寄存器; ④让编译器进行分配内嵌汇编使用的标记是__asm或asm关键字,用法如下:__asm{instruction [; instruction]}或asm("instruction [; instruction]")。 下面是一个例子来说明如何在C中内嵌汇编语言: //C语言文件*.c #include void my_strcpy(const char *src, char *dest){ char ch; __asm{ loop: ldrb ch, [src], #1 strb ch, [dest], #1 cmp ch, #0 bne loop } } int main(){ char *a="forget it and move on!"; char b[64]; my_strcpy(a, b); printf("original: %s", a); printf("copyed: %s", b); return 0; } 在此例子中C语言和汇编之间的值传递是用C语言的指针来实现的,因为指针对应的是地址,所以汇编中也可以访问。

汇编语言复习题

汇编语言复习题 第2章8086CPU寄存器的结构及使用 1.8086CPU由指令执行部件EU和总线接口部件BIU两部分组成。其中EU的功能是控制和执行指令,主要由算术逻辑部件ALU、EU控制部件、8个16位寄存器和一个标志寄存器FLAGS组成。BIU的功能是从存储器预取指令和数据,以及所有EU需要的总线操作,实现CPU与存储器和外设间信息传递。BIU由指令队列、指令指针寄存器、段寄存器、地址加器组成。 2.Intel 8086CPU共有14个16位寄存器,它们分别是通用寄存器8个即AX、BX、CX、DX、SP、BP、SI、DI,其中能用作寄存器间接寻址的寄存有BX、BP、SI和DI,控制寄存器2个即IP、PSW,段寄存器4个即DS、SS、CS和ES它们的含义分别是: 其中在编程过程中程序的段基值由汇编程序装入的段寄存器是SS和CS ,由编程者用汇编指令将段基值装入的段寄存器是DS和ES,其具体指令是MOV AX,数据段段/附加数据段名,MOV DS/ES,AX,编程人员不能用指令去取其值或给其设置给定值的寄存器是 IP ,但是可以通过某些指令的执行而自动修改其内容,如JMP NEXT指令的功能是将目的地址的偏移量送入IP。 3.PSW是程序状态字寄存器又称为标志寄存器,用来反映微处理器在程序运行时的某些状态,其中的6个状态标志位分别是OF、SF、ZF、AF、PF和CF,反映了刚执行完算术或逻辑运算指令后的某些特征。三个控制标志位是DF即方向标志、IF即中断标志位和TF陷阱标志。如两个8位的二进制数相加其状态标志位中各标志的值是多少?10110101+10011011。 4.8086CPU数据总线16根地址总线是20根能访问的最大存储空间是1MB。 第3章存储器的分段 1.在8086CPU中存储器的编址原则是按字节编址即每一个字节单元是一个存储器地址,在源程序中用常用十六进制数或符号来表示一个存储单元的地址。任何相邻的两个字节地址可以构成一个字地址,约定用较小的那个地址来表示字地址。程序员在编程时所用的地址称为逻辑地址,CPU访问的地址称为物理地址。物理地址与逻辑地址的关系是:物理地址=段基值*16+偏移地址。如有下列存储器的结构请按要求回答问题: ① 0002H的字节地址的内容是多少? ② 0002H的字地址的内容是多少? ③若该存储地址所在的数据段的段基值是0F3BH,则逻辑地址 为0004H的物理地址是多少?该物理地址的字单元内容是多少? ④物理地址是0F3B1H的字节单元内容是多少?

《汇编语言程序设计》期末复习题答案_57431457509182192

《汇编语言程序设计》复习题(答案指导/带页号)一、选择(30题) 1.下列是8位带符号二进制数的补码,其中最大的是( B )。参见P22 A、10001000 B、00000001 C、00000000 D、11111111 2.在一段汇编语言程序中多次调用另一段程序,用宏指令比用子程序实现 ( C )参见P157、158 A、占内存空间小,但速度慢 B、占内存空间相同,速度快 C、占内存空间大,但速度快 D、占内存空间相同,速度慢 3.数据定义为:EE DB 3,4 CC DW 3456H,6789H 执行指令“MOV CX,WORD PTR EE+1”后,(CX)= ( B )参见P27、63、64 A、0304H B、5604H C、3404H D、3456H 4.有如下指令序列: MOV AL,95H MOV CL,2 SAR AL,CL 上述指令序列执行后,AL的内容是( D )参见P95 A、05H B、25H C、24H D、0E5H 5.设A=18610,B=2738,C=0BB16,把这三个数看成无符号数,则它们之间的关系是( D )参见P23、15 A、A>B>C B、 A

《汇编语言》问题3.10解析

1、如果要在10000H处写入字型数据2266H,可以用以下的代码完成: mov ax,1000H mov ds,ax mov ax,2266H mov[0],ax 补全下面的代码,使它能够完成同样的功能:在如果要在10000H处写入字型数据2266H。 要求:不能使用“mov内容单元,寄存器”这类命令。 _____________ _____________ _____________ mov ax,2266H push ax 解析:大家看,如何实现在10000H处写入字型数据2266H? 也就是说要在SS:SP(1000:0)指向的栈顶处将字型数据2266H写入。 那我们在10000H处写入字型数据2266H前的栈顶指向肯定SS:SP(1000:2),即为我需要初始化栈时设定的栈顶。 因此,完成的程序如下。 mov ax.1000H mov ss,ax mov sp,2 mov ax,2266H push ax 2、如果要在1000H处读取字型数据2266H,可以用以下的代码完成: mov ax,1000H mov ds,ax mov ax,2266H mov ax,[0] 补全下面的代码,使它能够完成同样的功能:在如果要在10000H处读取字型数据2266H。 要求:不能使用“mov内容单元,寄存器”这类命令。 _____________ _____________ _____________ mov ax,2266H pop ax 解析:如何在10000H处读取字型数据2266H? 也就是说要在SS:SP(1000:0)指向的栈顶处将字型数据2266H读取。 那我们在10000H处读取字型数据2266H前的栈顶指向肯定SS:SP(1000:0),即为我需要初始化栈时设定的栈顶。 因此,完成的程序如下。 mov ax.1000H mov ss,ax mov sp,0 mov ax,2266H pop ax 总结:写入数据的话,写入数据时的栈顶和当前栈顶(即写入数据前的栈顶)不一样;读取数据的话,读取数据时的栈顶和当前栈顶(即读取数据前的栈顶)一样。

浅谈对C语言的认识

浅谈对C语言的认识 摘要:C语言作为一种通用的命令式计算机编程语言,提供了有效利用汇编语言的途径,使低级的机器指令能以简易的方式进行编译。随着C语言的国际标准化,它已经成为有史以来使用最广泛的编程语言之一,对计算机编程领域产生了不可估量的影响。计算机编程爱好者和专业人士都应当学习C语言,为学习高级编程语言奠定坚实的编程基础。本文从C语言的语法特点、数据结构、应用以及衍生等方面进行简要介绍,旨在提供入门知识的浅显参考。 关键字:C语言;语法特点;数据结构 一、C语言的语法特点 1. 字符集 C语言的基本字符集包括基本拉丁字母小写和大写字母(a-z,A-Z)、十进制数字(0-9)、特殊图形字符(!@#$%^&*()[]{};:’”,<.>/?`~\|)以及空白字符(空格、水平制表符、垂直制表符、换页符、换行符)。虽然换行符只是表示文本行的结尾,实际并不需要与某个字符对应,但是为了方便,C语言中它仍然被认为是一个字符。字符串文字使得C语言可以进行多字节字符编码,并且C标准库中自带字符串操作函数。C语言的可执行字符集包含相同的字符,以及警报、退格和回车等。随着C语言标准的不断修订,对扩展字符集的支持逐渐在增加。

2. 关键字 C语言中定义了一些特殊的关键字,只能用于C语言编译本身使用,而不能用于如命名之类的操作。在C语言标准C89中有32个常见关键字,如double、int、Char等数据型关键字,以及if、else、break、Continue等控制型关键字。后来的C99和C11标准又分别提出了5个和7个关键字,如_Bool、_Alignas等。大多数最新的关键字都是以下划线开头,后面跟着一个大写字母。当C开始支持这些扩展关键字时,以前留存的C程序代码没有使用过这些关键字,因此不会受到任何影响,在无需任何改动的情况下仍可继续使用。 3. 运算符 运算符是语句表达式中,用于指定执行该表达式时要执行的具体操作。C语言支持相当多的运算符,如加(+)、减(-)、乘(*)、除(/)、余(%)等算术符,赋值符(=)、大于(>)、小于(<)、不大于(<=)、不小于(>=)等关系符。C语言遵循Fortran和PL/I的语言习惯,用等于号(=)来表示赋值,但与ALGOL 等语言不同,C使用(==)来检验是否相等。如果混淆这两个运算符(=和==),很容易导致意外的错误,并且在很多情况下不会产生错误信息,例如条件表达式if (a==b+1)和if (a=b+1)都可以编译通过,但运行结果是截然不同的。 二、C语言的数据结构 C语言中的数据是静态的,有各种大小的整数类型(有符号和无符号)、浮点数和枚举类型,以及派生类型,包括数组、指针等。 1. 指针 C语言支持使用指针,这是一种在内存中记录对象或函数的地址或地址引用的数据类型。指针可以被间接用于访问存储在指向地址的数据,或调用指向函数,通过赋值或指针算术即可操作指针。指针在C语言中用途繁多,例如文本字符串通常使用指针指向字符数组,动态内存分配使用指针执行,许多如树这样的数据类型通常采用指针链接在一起的方式进行动态分配结构对象。指针的使用需格外小心,因为它们通常是未选中的,可以使指针变量指向任意位置,这可能会导致意外的错误。所幸的是,C语言允许指针类型之间进行操作和转换,能够有效地将指针指向安全的地方。 2. 数组

汇编语言程序设计第一二三阶段在线作业

第一次在线作业)单选题 (共40道题 2.51.(分)8086CPU在基址变址的寻址方式中,变址寄存器可以为:?CX或、BX A?SI B、CX或?SI C、DX或?DI D、SI或我的答案:D 此题得分:2.5分的源操作数的位置是:,,则指令SI=1234H MOV AX,[BX+SI+2]2.52.(分)已知BX=2000H?的字节、数据段中偏移量为3236H A?的字节、附加段中偏移量为3234H B?的字节、数据段中偏移量为3234H C?的字节D、附加段中偏移量为3236H我的答案:分A 此题得分:2.5IP(2.5分)在程序执行过程中,寄存器中始终保存的是: 3.?、上一条指令的首地址A?、下一条指令的首地址B ?、正在执行指令的首地址C ?、需计算有效地址后才能确定地址D我的答案:2.5分B 此题得分:,那32K16分)位二进制)是某系列微机对存储器的分段,如果每一个段最多的字存储单元(2.54.(么表示段内字节单元偏移地址的二进制位数应是:?位20 A、?位16 B、?位C、15 ?位12 D、我的答案:B 此题得分:2.5分(2.5分)可用作寄存器间接寻址或基址、变址寻址的地址寄存器,正确的是:5.?DXCX,AX A、,BX,?SS,CSB、DS,ES, ?BXBP,IP,,C、SP?BXBP,,D、SIDI,我的答案:分D 此题得分: 2.5 . . . . 顺序存放在连续两个字存储单元中,可选用Ⅱ码两个字符的ASC41H,42H分)6.(2.5 要求将A,B的语句是:?‘AB'B A、DA1 D ?‘AB'DW B、DA1 ?ABHB C、DA1 ?ABHW D、DA1 我的答案:2.5分A 此题得分:下面语句中有语法错误的语句是:7.(2.5分)?5HDB A、?ABCDHB、DW ?‘ABCD'C、DW ?‘AB'、DDD 我的答案:分2.5C 此题得分:(2.5分)寄存器间接寻址方式中,操作数存放在:8.?、通用寄存器A?、堆栈B?、程序计数器C?、主存单元D 我的答案: D 此题得分:2.5分 2.5(分)操作数地址存放在寄存器的寻址方式称为:9.?、变址寻址A ?、寄存器寻址B?、相对寻址C?、寄存器间接寻址D我的答案:此题得分:2.5分D 操作数的物理地址是:BYTE PTR[DI](10.2.5分)设DI=3942HDS=8225H,,指令NEG ?85B92H、A?86192H、B?BB690H C、?12169H、D我的答案:2.5分A 此题得分:下列寄存器组中在段内寻址时可以提供偏移地址的寄存器组是:分)(2.5 11.?DX,BXCX,,、 AAX . . . . ?DI,SI,、BBX,BP?DXBP,,C、SP,IP ?SSES,、DCS,DS, 我的答案:2.5分B 此题得分:分配的存,10H),3BUF5) 上述语句汇编后,为变量12.10H (2.5分)BUF DW DUP(3 ,DUP(2储单元字节数是:?80HA、 ?100HB、 ?124C 、?192、D我的答案:此题得分:2.5B 分13.发出的访问存储器的地址是:(2.5分)CPU?、物理地址A?、偏移地址B?、逻辑地址C?、段地址D我的答案:分A 此题得分:2.5]指令中的操作数的数据类型是:BYTE DEC PTR[BX14.(2.5分) ?、字A?、双字B?、字节C?、四字D我的答案:C 分此题得分:2.5BUFFER称为:,0AH 中,15.(2.5分)在语句BUFFER DB 01H?、符号A?、变量B?、助记符C?、标号D我的答案:B 此题得分:2.5分将数据5618H存放在存储单元中的伪指令是:16.(2.5分)?1856HDATA1 DW A、

汇编语言期末试卷复习(附答案)上课讲义

选择题 1. 已知X=78,Y= -83则[X+Y]补=() A.0F5H B.0A1H C.0FBH D.65H 2. MOV AX, ES:COUNT[DI] 源操作数的寻址方式是() A.基址寻址 B.立即寻址 C.变址寻址 D.基址变址寻址 3. 指令MOV BX, MASK[BP],若MASK=3500H,SS=1200H,DS=1000H,BP=1000H,那么物理地址为() A.17500H B.16500H C.14500H D.13500H 4. 下列四组寄存器中,在段内寻址时可以提供偏移地址的寄存器组是() A.AX,BX,CX,DX B.BP,SP,IP,CS C.BX,BP,SI,DI D.BH,BL,CH,CL 5. 当执行指令ADD AX,BX后,若AX的内容为2BA0H,设置的奇偶标志位PF=1,下面的叙述正确的是() A. 表示结果中含1的个数为偶数 B. 表示结果中含1的个数为奇数 C. 表示该数为偶数 D. 表示结果中低八位含1的个数为偶数 6. 下列传送指令中,有语法错误的指令是()。 A.MOV CS,AX B.MOV DS,AX C.MOV ES,AX D.MOV SS,AX 7. MOV SP,3210H PUSH AX执行上述指令序理后,SP寄存器的值是()。 A.3211H B. 320EH C.320FH D. 3212H 8. 设(DH)=20H,执行NEG DH指令后,正确的结果是() A.(DH)=20H CF=1 B.(DH)=20H CF=0 C.(DH)=0E0H CF=0 D.(DH)=0E0H CF=1 9. 执行下面指令序列后,结果是() MOV AL,82H CBW A.AX=0FF82H B.AX=8082H C.AX=0082H D.AX=0F82H

汇编语言上机操作及程序调试的方法

汇编语言上机操作及程序调试的方法第一节在IBM-PC机上运行汇编源程序所必备的软件 为了在IBM-PC机上运行汇编源程序,机器上必须有DOS操作系统环境,DOS系统盘上应有下列文件: EDIT 文件编辑程序 MASM 宏汇编程序 LINK 链接程序 DEBUG 调试程序 第二节在IBM-PC机上运行汇编源程序的步骤 当用户编制好汇编语言源程序之后,要在机器上运行,必须经过以下几个步骤: 1.用EDIT命令建立与修改汇编源程序文件(ASM文件) 源程序就是用汇编语言的语句编写的程序,必须以ASM为附加文件名。2.用MASM命令汇编源文件以产生相应的目标文件(OBJ文件) 3.用LINK命令连接目标文件以产生可执行文件(EXE文件) 4.调试、运行可执行文件

上机过程示意图如下: 汇编语言程序 编辑程序 汇编程序 连接程序 调试程序 有错吗? 运行程序 Y N 图2-1 汇编语言程序上机过程流程 第三节 DEBUG 程序调用及汇编语言程序调试方法 调试程序DEBUG 是DOS 支持的又一种系统软件,主要用于汇编语言程序的调试。汇编和连接过程只能查出源程序的语法错误,不能查出功能上的错误和程序不完善的地方。 一、DEBUG 程序的启动 DEBUG 程序有两种启动方法。 第一种启动方法:只要打入DEBUG 和回车键,就可以把它装入内存。但是这样启动只把DEBUG 程序本身装入内存并进入等待DEBUG 命令状态,还没有把要调试的程序装入内存。 第二种启动DEBUG 的程序的方法是一次相继装入DEBUG 程序和要调试的程序。打入的命令格式如下: DEBUG[d :][path]filename[.ext][parml]Lparm2] 其中的Filename 是要调试程序的文件名,可选项[d:][path]和[.ext]分别是要调试程序的所在盘符、路径和扩展名。可选项[parml]和[parm2]是DEBUG 程序为要调试程序准备的参数(一般不用)。 例 进入DEBUG 程序并装入要调试程序,要调试程序在A 驱动器中。其操

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