汇编语言第5章王爽版(子程序调用指令)
- 格式:ppt
- 大小:141.00 KB
- 文档页数:23
汇编语⾔(王爽)学习记录_第五章第五章 [bx]和loop指令1. [bx]和内存单元的描述在debug中mov ax,[0]表⽰将ds:0中的字型数据送⼊ax寄存器,⽽在编译器中此命令表⽰将0数据送⼊ax,则需改为mov ax,[bx]。
间直接是编译器将内存单元送⼊ax。
完整描述⼀个内存单元:1.内存单元的地址,2.内存单元的长度(类似al字节型,ax字型)2.looploop循环的意思3.我们定义的描述性的符号:“()”⽤“( )”表⽰⼀个寄存器或⼀个内存单元的内容,(al)、(20000H)、((ds)*16+(bx))⽐如add ax,2 描述为:(ax) = (ax)+2(X)可表⽰两种数据类型:字,字节。
取决于寄存器或具体的运算⽐如(al)表⽰字节型数据(ax)表⽰字型数据。
4.约定符号idata表⽰常量例如mov ax,[idata] 可表⽰mov ax,[1]、mov ax,[5]。
mov ax,idata可表⽰mov ax,1、 mov ax,3。
等等5.1 [bx]mov ax,[bx],可以看成是:mov bx,idata mov ax,[bx]问题5.1需要注意的是数据类型是字节型还是字型,其他就跟着题⽬看就是了。
5.2 loop指令loop指令与cx通⽤寄存器有关,执⾏loop时要进⾏两步操作:1.(cx) = (cx)-1 、2.判断(cx)不为0则执⾏标号处程序。
例:求2的12次⽅assume cs:codecode segment mov ax,2 mov cx,11s: add ax,ax loop s mov ax,4c00h int 21hcode endsend其中s是标号,当cx不为0时转⾄s处程序。
问题5.2 ⽤加法计算123*236assume cs:codecode segment mov ax,0s: add ax,123 loop s mov ax,4c00h int 21hcode endsend问题5.3 上⾯程序循环236次可以改进程序为循环123次assume cs:codecode segment mov ax,0 mov cx,123s: add ax,256 loop s mov ax,4c00h int 21hcode endsend5.3 在debug中跟踪⽤loop指令实现的循环程序问题:计算ffff:0006单元中的数乘以3结果存储在dx中 (1)考虑dx存储范围:ffff;0006是字节型数据0~255,乘3不会超过65535。
汇编语⾔(王爽第三版)实验5编写、调试具体多个段的程序实验5 编写、调试具体多个段的程序⼀。
将下⾯的程序编译连接,⽤Debug加载、跟踪,然后回答问题。
assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax,4c00hint 21hcode endsend start程序分析:由于是初次接触,我们逐步讲解,废话多点。
(1)此程序考察的是内存中数据段和栈段的定义。
程序共定义了1个数据段,data段,⾸先明确,在程序运⾏开始(标号start处),这个数据段就已经被定义好了,并且分配了内存空间,并赋值了。
⼀个栈段,stack。
同理这个数据段在没有被⼈⼯定义为栈结构时,也被定义好了。
并且分配了内存空间,并赋值了。
将此程序编译并连接后,使⽤debug调试,(这⾥需要注意,以下的段地址可能由于系统不同⽽有差异,主要是理解概念。
)E:\assembly>debug eee.exe-rAX=0000 BX=0000 CX=0042 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B55 ES=0B55 SS=0B65 CS=0B67 IP=0000 NV UP EI PL NZ NA PO NC0B67:0000 B8660B MOV AX,0B66程序分析:我们什么也没执⾏,此时我们在data段定义的数据在哪?在ds:0100H处(原来讲过,程序最开始时ds:00~ds:100H是留给程序与操作系统通讯使⽤的psp内存段,参见书中p92);也就是说我们在ds:100H、0B55:100H或0B65:00处可以看见这些定义的数据。
汇编语⾔(王爽)第五章
第五章 [BX]和loop指令
*Loop指令
格式:loop 标号
等同步骤:(1)(cx)=(cx)-1;(2)若(cx)!=0,跳转到标号位置继续执⾏。
*Debug的相关命令及说明
g命令:g 偏移地址;使得执⾏到cs:偏移地址处停⽌;
p命令:使Debug程序⾃动重复执⾏代码中的循环指令,直到(cx)=0为⽌。
⽤Debug中直接写⼊指令,[idata]可以表⽰((段地址)*16+idata)处的值;⽽如果在汇编源代码中[idata]会被编译器masm处理为idata这个数值。
所以在汇编源代码中当使⽤⽴即数来表⽰偏移地址时,须加前缀以显式表明,⽐如:ds:[idata]。
*⽰例:计算ffff:0~ffff:b内存单元中数据的和,结果存储在dx中。
;1.每个内存单元⾥的数值是单字节类型,⽽dx是双字节寄存器
;2.总计12个内存单元的数据和最⼤为255*12<65535,不会产⽣溢出
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax
mov bx,0;存储⽬标位置偏移地址
mov dx,0;初始化结果
mov ah,0;设置中转数的⾼位
mov cx,12
s:
mov al,[bx]
add dx,ax
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
*⼀段安全的空间:汇编学习过程中可以使⽤00200h~002ffh这段空间,总计256个字节。
子程序调用指令
子程序调用指令是指一个程序在一段程序运行时,该段程序执行某个功能时,会调用由另一段子程序处理的指令的一种机器指令。
子程序调用指令的运行过程主要分为六个步骤:
1、先将书写代码时在子程序指令里声明的一个标记符(参数可以有一到多个)放入程序计数器,编程使程序跳转至对应的子程序。
2、将参数放入堆栈中。
3、程序计数器指向下一个指令(位置),将其存入返回地址寄存器中。
4、转至子程序,调用子程序中的指令,直至子程序返回跳转指令。
5、将从子程序返回的参数或结果放入程序总线中。
6、程序计数器指向堆栈中保存的返回地址,继续执行程序。
子程序调用指令的使用有很多优点,可以将程序设计的复杂性降低,提高代码的可维护性,减少重复的编码,并使程序更加结构良好和清晰。
同时,由于调用子程序时需要使用到跳转指令,也可以减少程序运行所需的时间。
然而,程序的运行效率有时也会根据子程序的大小和复杂性以及条件的多少而有所降低。
汇编语⾔-王爽前⾔学习汇编的两个最根本的⽬的:充分获得底层编程的体验,深刻理解机器运⾏程序的机理。
任何不以循序渐进的⽅式进⾏的学习,都将出现盲⽬探索和不成系统的情况,最终学习到的也⼤都是相对零散的知识,并不能建⽴起⼀个系统的知识结构。
⾮循序渐进的学习,也达不到循序渐进学习所能达到的深度,因为后者是步步深⼊的,每⼀步都以前⼀步为基础必须遵守的原则:①没有通过监测点不要向下学习②没有完成当前的实验不要向下学习③每⼀个实验都是后续内容的基础,实验的任务必须独⽴完成④本书的教学重⼼是:通过学习关键指令来深⼊理解机器⼯作的基本原理,培养底层编程意识和思想我们必须通过⼀定的编程实践,体验⼀个裸机的环境,在⼀个没有操作系统的环境中直接对硬件编程第1章基础知识汇编语⾔是直接在硬件之上⼯作的编程语⾔机器语⾔/机器指令集是机器指令的集合寄存器是CPU中可以存储数据的器件编译器能够将汇编指令转换成机器指令的翻译程序汇编语⾔由以下3类指令组成:1.汇编指令:机器码的助记符,由对应的机器码(核⼼) <汇编指令是机器指令便于记忆的书写格式>2.伪指令:没有对应的机器码,由编译器执⾏,计算机并不执⾏3.其他符号:+ - * /要想让⼀个CPU⼯作,就必须向它提供指令和数据。
指令和数据在存储器中存放,也就是我们平时所说的内存CPU要从内存中读数据,⾸先要指定存储单元的地址,CPU在读写数据时还要指明。
它要对哪个器件进⾏哪种操作所以CPU要想进⾏数据的读写,必须和外部器件进⾏下⾯3类信息的交互->存储单元的地址(地址信息)器件的选择,读或写的命令(控制信息)读或写的数据(数据信息)指令和数据没有任何区别,都是⼆进制信息。
CPU在⼯作的时候把有的信息看作数据,为同样的信息赋予了不同的意义1 Byte = 8 bit = 8个⼆进制位 = 8位⼆进制数据在计算机中专门有连接CPU和其他芯⽚的导线,通常称为总线,总线从逻辑上分为3类,地址总线、控制总线、数据总线(1)CPU通过地址线将地址信息3发出(2)CPU通过控制线发出内存读命令,选中存储器芯⽚并通知它将要从中读取数据(3)存储器将3号单元中的数据8通过数据线送⼊CPUCPU是通过地址总线来指定存储器单元的10根导线可以传送10位⼆进制数据。
王爽汇编笔记第一章基础知识本章概述:1.汇编语言基本上是直接在硬件上工作的编程语言,需要了解硬件系统才能更好的应用汇编编程。
2.最终运行程序的是CPU,我们用汇编语言编程时,必须要从CPU的角度考虑问题。
一、机器语言1.机器语言是机器指令的集合,它是机器可以正确执行的命令,是一列二进制数字。
CPU将之转变为一列高低电平,以便计算机的电子器件受到驱动,进行计算。
2.每一种微处理器,由于硬件设计和内部结构不同,就需要用不同的电平脉冲来控制,使它工作。
所以每一种微处理器都有自己的机器指令集,也就是机器语言。
二、汇编语言的产生1.机器语言使用上的不便造就了汇编语言的产生。
2.汇编语言是机器指令便于记忆的书写格式。
3.汇编语言的编译器把汇编语言编译成机器指令,由计算机最终执行。
三、汇编语言的组成1.汇编指令:机器码的助记符,有对应的机器码,汇编语言的核心,决定汇编语言的特性。
2.伪指令:没有对应的机器码,由编译器执行,计算机不执行。
3.其他符号:如+、—、*、/等,有编译器识别,没有对应的机器码。
四、存储器1.内存是给CPU提供数据和指令的部件,它是程序运行的基本资源。
2.磁盘上的数据和程序需要先读到内存中才可以被CPU使用。
五、指令和数据1.指令和数据是应用上的概念。
2.在内存和磁盘上,指令好数据没有任何区别,都是二进制信息。
3.在CPU运行时才区分数据和信息。
六、存储单元1.存储一个bit信息的硬件存储单位是存储元。
2.一般是8个存储元组成一个存储单元。
3.若干存储单元再组成存储器。
七、CPU对存储器的读写1.存储单元从零开始顺序编号,这些编号可以看作存储单元在存储器中的地址。
2.CPU要访问内存必须先要指定存储单元的地址。
3.在计算系统中一般存储器有很多个,必须指明准确的地址和读写访问的控制信息。
4.总线按逻辑分有:地址总线、控制总线、数据总线。
5.执行顺序:地址信息、控制信息、数据信息。
6.总线直接是和CPU的管脚连接起来的。
汇编语言第二版王爽完整答案第1章基础知识检测点1.1(1) 1个的寻址能力为8,那么它的地址总线的宽度为13。
(2) 1的存储器有1024个存储单元。
存储单元的编号从0到1023。
⑶1的存储器可以存储1024*8个,1024个。
(4) 1、1、1分别是2八30、2八20、2A10。
(n A m的意思是n的m次幕)(5) 8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64()、1()、16()、4()。
⑹8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32 根。
则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。
⑺从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
检测点2.1(1) 写出每条汇编指令执行后相关寄存器中的值。
,62627 4A3H,31H 31A3H,23H 3123H6246H,826 8266246H82604D8H0482H6C82H882H,6 888H810H6246H(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方解:,2检测点2.2(1)给定段地址为0001H,仅通过变化偏移地址寻址,的寻址范围为00010H到1000(2)有一数据存放在内存20000H单元中,先给定段地址为,若想用偏移地址寻到此单元则应满足的条件是:最小为1001H,最大为2000H检测点2.3下面的3条指令执行后,几次修改?都是在什么时候?最后中的值是多少?解:修改4次;第一次在读取“ ”后,第二次在读取“ ”后,第三次在读取“ ”后,第四次在执行完“ ”后;最后中的值为0。
实验1查看和内存,用机器指令和汇编指令编程1. 略2.(1) 略⑵略(3) 查看内存中的内容。