各位老铁们好,相信很多人对深入解析: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位网友表示赞同!
2019年的汇编知识点应该还好吧,我现在学的好像还停留在古老版本
【深入解析:2019年汇编语言核心知识点汇总】相关文章:
1.蛤蟆讨媳妇【哈尼族民间故事】
2.米颠拜石
3.王羲之临池学书
4.清代敢于创新的“浓墨宰相”——刘墉
5.“巧取豪夺”的由来--米芾逸事
6.荒唐洁癖 惜砚如身(米芾逸事)
7.拜石为兄--米芾逸事
8.郑板桥轶事十则
9.王献之被公主抢亲后的悲惨人生
10.史上真实张三丰:在棺材中竟神奇复活