欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析:2019年汇编语言核心知识点汇总

时间:11-01 民间故事 提交错误

各位老铁们好,相信很多人对深入解析:2019年汇编语言核心知识点汇总都不是特别的了解,因此呢,今天就来为大家分享下关于深入解析:2019年汇编语言核心知识点汇总以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

汇编程序执行过程:

编译---连接---加载(command程序)(送入内存中)---运行(CPU)

利用debug对程序执行过程的跟踪(P91)

当CS:IP指向程序入口时,命令放弃对CPU的控制,CPU立即开始运行程序,直到程序结束,但debug对cpu的控制还在,所以可以用debug实现对程序的跟踪

【BX】、【LOOP】指令 2019-06-01

inc bx:bx中的内容加1

移动bx,1

inc bx执行后,bx=2

LOOP:

LOOP指令的格式:LOOP+标号。 CPU执行LOOP指令时,需要执行两步:(cx)=(cx)-1判断cx中的值。如果不为零,则转到标签处执行。程序,如果为零则向下执行(通常cx中存放的是循环次数)

使用cx和LOOP指令实现循环功能的程序框架如下:

mov cx,循环次数

s:循环执行的程序段

循环SA(97H)A(65H)

1. mov AX, [BP] 求物理地址时,为什么用ss作为段地址,而不是用DS作为段地址?

===这是设计CPU时默认的设置方法,必须遵循。

BX、SI、DS配合使用; DI与ES配合使用; BP和SS一起使用。 AX、CX、DX 通常不用作偏移地址。 AX是累加器,CX是计数器,DOS的一些函数调用也使用DX来存储有效地址。

OFFSET 返回偏移地址EA 的地址

不能将立即数赋予段寄存器

CX:cx中的值影响LOOP指令的执行结果,cx中保存的是循环次数

源程序中数据不能以字母开头(如:0A003)

调试后r检查寄存器时,程序的长度(字节)存储在cx中。调试执行“g0012”后,执行CS:0012之前的程序段。

当遇到t调试后出现LOOP 0012时,使用P命令会导致debug自动重复循环中的指令,直到cx=0(而不是多次单步执行t)===也可以使用g 0016直接执行to cs:0016 位于源程序中。如果使用指令访问内存单元,则指令中必须使用[ ]来表示内存单元。如果在[ ]中使用常量idata直接给出内存单元的偏移地址,则必须在[ ]前面显式给出该段地址所在的段寄存器eg: mov al, ds:[0]。如果没有写入段寄存器,编译器masm会将指令的[idata]解释为idata

如果[]中使用bx等寄存器来间接给出内存单元的偏移地址,则段地址默认为ds,也可以显式表示段寄存器。

0:200~0:2FF这块内存空间是比较安全的

通过在源程序中定义段来获取内存空间(p123)

在程序中,段名就相当于一个标号,它代表了段地址,一个段中的数据的段地址可由段名代表,偏移地址就看它在段中的位置(第131页)

数据段

"

数据结束

,

移动斧头,数据

mov ds,ax

mov bx,ds:[6]cpu若要访问data段中的数据,则用ds指向data段,用其他寄存器存放data段中的偏移地址(如bx)(p132)

在没有寄存器的情况下,使用(Word byte, ptr)指定内存单元的长度。 Push 指令对字ax 进行操作。 div除法指令意味着(被除数在ax中,(如果除数是8位)结果al存储在商中,ah存储余数)(如果除数是16位,结果ax存储商,dx存储余数)ax/al/eax 用作累加器,指令为(in、out、XLAT) 汇编语言源程序有哪三种类型?一个基本语句:)指令语句-----有其对应的机器指令

(2)伪指令-----没有对应的机器指令,它只是指示汇编器如何处理

(3)宏指令---mov al,5(al为目的操作数(src),5为源操作数(drs))SHL(逻辑左移)、SAL(算术左移)、SHR、SAR—— ---》SAL ax,1(左移一位,如果是两位以上,用CL表示) 一个代码段的起始偏移地址为0。

debug的常用命令

DEBUG命令有很多。以下是一些常见的。使用DEBUG命令。

(1)反汇编命令 U格式: U[段地址]:[偏移地址]

b. U [地址范围]

功能:以汇编语言形式显示指定范围内的代码,同时显示该代码的内存地址和机器码。如果命令中没有指定地址,则以上一条U命令最后一条指令地址的下一个单元为起始地址;如果没有输入U命令,则反汇编32字节;即代码段的起始地址为32字节单元内容。如下图:

[图片上传失败.(image-225540-1555939749851)]

图2-10 DEBUG 中U 命令的使用

反汇编中第一行的含义如下:0CF2:0000是代码段的段地址和偏移地址; B8F10C为第一条有效指令的机器码; MOV AX,0CF1是反汇编指令形式。

范围可以由起始地址、结束地址(只能包含地址偏移量)或起始地址和长度来指定。命令格式为:U 0CF2:0000 0008 或U 04BA:0000 L7。

(2)显示内存命令 D格式: D [地址]

b. D [地址范围]

c. D

功能:显示指定内存范围的内容。

显示的内容有两种形式:一种是十六进制内容,另一种是十六进制对应的ASCII码字符。不可见字符被替换为“·”。格式a和c每次显示128字节,格式b显示的字节数由地址范围决定。

如果命令中有地址,则显示的内容从指定地址开始。如果命令中没有地址(如格式c),则显示的内容从上一条D命令显示的最后一个单元的下一个单元开始。如果之前没有使用过D指令,则会从代码段的开头开始显示。如果格式中的地址只有偏移地址,则段地址就是CS的内容。命令格式为:D 0CF1:0000 或D 或D 0080。其用法如图2-10 所示。

[图片上传失败.(image-b6e012-1555939749851)]

图2-11 DEBUG 中D 命令的使用

(3)修改存储单元内容命令 E格式: E [地址] [目录]

b. E [地址]

功能:format a 用命令给定的内容表替换指定地址范围内存单元的内容。

格式b逐个单元地连续修改单元内容。

其中:内容表是一个十六进制数,也可以是单引号括起来的字符串。其命令格式如下:

E 0CF1:0000 ‘********’或E 0CF1:0010,其用法如图2-11所示。

[图片上传失败.(image-7db1b8-1555939749850)]

图2-12 DEBUG 中E 命令的使用

(4)检查和修改寄存器内容命令 R格式:a.R 例如-r

b.R [寄存器名称] 例如:-r ax 显示ax的内容。然后输入数据x,将ax的值改为x。

功能: A.显示CPU内部所有寄存器的内容以及所有标志位的状态。

b.显示和修改指定寄存器的内容和标志位的状态。

让CPU执行段地址为1500、偏移地址为1300的指令。但是:

1-r cs 显示cs值。再次输入1500。

2 然后-r ip 显示ip 的值。输入1300就可以了

3 可以用-r查看

状态标志寄存器FLAG以位的形式显示。显示时,8 个状态标志位的显示顺序及符号如表2-1 所示。其使用如图2-12所示。

图2-13 DEBUG中R命令的使用

(5)跟踪与显示命令 T格式: T[=地址] 或T[地址] (必须有****=)

b. T[=地址][项目数] 或T[地址][项目数]

功能: A.在指定地址执行一条指令,停止,并显示CPU所有寄存器的内容和所有标志位的状态,以及下一条指令的地址和内容。

b.对于多个跟踪命令,从指定地址开始;如果命令中以[address]给出起始地址,则从起始地址开始。如果没有给出,将从当前地址(CS:IP)开始执行命令。中的[number]决定返回DEBUG状态之前总共跟踪多少条指令。

[图片上传失败.(image-c308ab-1555939749850)] 图2-14 DEBUG 中T 命令的使用

上图中,第一次输入T=0000 2代表从偏移地址0000开始执行了2条指令,随后显示了这两条指令执行后的寄存器以及下一条要执行的指令。地址分别为0CF2:0003和0CF2:0005。

第二次输入T指令后,上述指令继续执行下一条指令,即地址为0CF2:0005的指令,并显示执行后的寄存器内容。最后一行显示下一条要执行的指令,地址为0CF2:0009。

(6)运行命令 G格式:G[=地址][地址[地址.]]

功能:执行用户正在调试的程序。

该地址为执行的起始地址,CS中的内容作为段地址,等号后面的地址作为偏移地址。下面的地址就是断点地址。如果命令行中只有起始地址,没有断点地址,程序执行过程中不会被中断。 DEBUG 指定最多可以设置10 个断点地址。设置多个断点用于调试较大的程序,即程序中有多个模块、多个路径时,比较方便。无论执行时走哪条路径,程序都可以停在断点处,以便调整程序。

断点地址是程序中断的偏移地址,段地址在CS中。

当执行DEBUG状态下汇编的小程序时,只能使用G指令。执行例1-1的效果如下:

[图片上传失败.(image-c0cc61-1555939749849)]

图2-15 DEBUG 中G 命令的使用

(7)汇编命令 A格式: A [段寄存器q名称] : [偏移地址]

b. A【段地址】:【偏移地址】

c. A [偏移地址]

d.A

功能:使用该命令将汇编语言程序直接汇编成

如果在调试目标程序的过程中,需要重写或者增加一段目标程序,可以直接在Debug下使用A命令来实现。

输入A命令后,显示段地址和偏移地址,等待用户输入汇编指令。每输入一条汇编指令按回车后,会自动显示下一条指令的段地址和偏移地址,然后再输入下一条汇编指令,直至汇编完成。所有语言程序都输入完毕,显示下一个地址后,可以直接敲回车,回到提示符“-”。

a的段地址在段地址寄存器中,所以使用该命令时,必须将段地址发送到段地址寄存器中,c的地址在CS中,d的段地址在CS中,偏移量地址为100H。

[图片上传失败.(image-cda818-1555939749849)]

图2-16 DEBUG 中A 命令的使用

从上图可以看到,我们可以直接输入汇编指令,常用的数据定义指令也可以直接通过A指令写入。

(8)结束DEBUG并返回DOS命令Q

格式:问

功能:程序调试完毕后退出DEBUG状态,返回DOS状态。

五、汇编程序提示的常见错误1. MASM编译时产生的警告错误“out of memory”可以忽略吗?

答:此类问题一般是在全角状态或中文状态下输入程序中的标点符号;在英文半角状态下重新输入程序中的标点符号就可以了。

2. MASM编译时产生的警告错误“Operand types must match”可以忽略吗?

答:不会,如果语句:MOV AL,BX 会产生上述错误信息,原因是两个操作数AL 和BX 的字长不匹配。

3、为什么编译MASM时会出现警告错误“Operand must have size”?

答:如果类似:MOV [SI+1], 10H 的语句会产生这样的错误,应改为:MOV BYTE PTR [SI+1], 10H。由于目标操作数是内存,因此源操作数———立即数据应指示字长是8 位还是16 位。如果目标操作数是寄存器,则不需要这样做。

4、为什么编译时会出现“Reserved word as symbol:XXXXXX”警告错误?

答:是指定义数据或定义符号名时使用保留字。如果数据段中出现LENGTH DW 256,则会生成警告,因为LENGTH 是值运算符,不应将名称标识为保留字。

5. 编译时指出某行时出现“Immediate modeillegal”错误是什么原因?

答:这意味着立即数据以非法指令形式出现。例如,如果数据段定义为:LENG EQU 1000H;并且代码段定义为:LEA BX, LENG,会出现此类错误是因为EQU 伪指令导致编译时代码中的所有LENG 符号都被替换为立即数1000H,而指令:LEA BX, 1000H是非法的。

6、程序中有一条语句:JC NEXT,导致编译错误“Jump out of range by 18 byte(s)”。怎么解决呢?

答:说明条件转移语句超出范围。 8088汇编规定条件传送语句的传送范围在:-128+127字节内。如果传输距离超出此范围,则应配合使用无条件传输语句。原代码可改为:JNC L1/JMP NEXT/L1: ……………./。

7、程序中定义了数据段,名为VAR的表包含0.9的十个数据。为什么初始语句:MOV AL、VAR 的执行结果不正确?

答:如果在代码段开头没有将数据段基地址分配给DS寄存器,就会出现这样的运行时错误,因为该段基地址不是所设置的数据段的基地址。

8.有一个数据段定义:DATA SEGMENT/…………./DATA ENDS/,语句

MOV AX, DATA 和MOV AX, SEG DATA 的含义相同吗?

答:不是,前者是获取DATA段的基地址,后者是获取DATA变量所在段的基地址。如果DATA已经定义为数据段的名称,然后又定义为变量或表的名称,则会出现编译错误。

9. 设置数据段中名为BUF1 的表包含字符串“Hello ctec!”,然后将名为BUF2 的表的长度设置为11 个字符,并将初始值设置为0。使用字符串传输命令代码段在实现BUF1——BUF2的传输时,没有发现语法和控制结构错误。为什么结果是错误的?

答:如果控制结构和指令形式正确,检查ES段是否定义。 MOVS指令要求源指针为DS :[SI],目的指针为ES :[DI],因此应定义ES段;当然,DS段和ES段可以是同一个段。

10、实验程序中有宏定义:

DOSF MACRO FUNNO/MOV AH,FUNNO INT 21H/ENDM /,参数FUN_NO是什么意思?

答:FUN_NO是宏定义中的形参,在宏应用时被实参替换。在此示例中,实际参数可以是立即数。

11、程序中有这么一条语句:运行时报MOV AX,8000H/MOV BL,4/DIV BL/算术溢出。为什么?怎么解决呢?

答:除法指令DIV规定,如果除数长度为8位,商的字长超出8位二进制数的表示范围,就会溢出。上例中,被除数为8000H,除数为4,结果:2000H超出了8位二进制数,即发生溢出错误。为了避免这种情况,可以使用移位或减法指令来代替除法指令。

12、为什么语句:LEA AX,ADDR正确,而MOV BL,[AX]错误?

答:前者是一个值语句,其作用是将ADDR的偏移地址值发送到寄存器AX中;后者使用AX寄存器作为间接寻址寄存器,这在8086/8088指令中是不允许的。

13、使用DOS函数调用9号显示字符串时,为什么显示乱码?

答:常见的情况是定义字符串缺少结束标记“”或ASCII码形式的24H。

14、Windows 2000和WIN_XP的运行程序窗口中没有出现数值结果怎么办?

答:1、首先保证显示的数字是标准的ASCII码;

2将正在运行的程序的属性设置为:全屏显示,退出时不关闭窗口。

15、实现BCD码表示的两个十进制数相加,如34、56,需要输出BCD码结果;为什么输入数据应该是34H和56H?

答:BCD码是由四位二进制数表示的十进制数。十进制数34用BCD码表示为00110100B,写成十六进制数即为34H;加法计算的实际结果是十六进制数34H和56H。加法的结果需要通过调整命令DAA:90H将其调整为期望结果的BCD码。

16、用DOS功能调用2号函数显示数字,语句为: /MOV DL, CL /MOV AH, 2 /INT 21H /

为什么无法显示结果?

答:参数DL中应放置数字的ASCII码,而不是数字本身。在上面的程序中,如果CL中的值为0~9,则需要添加语句:ADD DL,30H。

好了,关于深入解析:2019年汇编语言核心知识点汇总和的问题到这里结束啦,希望可以解决您的问题哈!

用户评论

迷路的男人

学习汇编感觉很头疼,这知识点应该怎么啃下来啊?

    有9位网友表示赞同!