请问大佬们有网站吗下面汇编代码中 201,186,187,10,13这些的含义 还有就是使用dup()的目的是什么


· TA获得超过4.7万个赞

第一个10就代表在那里存一个10,第二个代表在那里存一个不确定的数,就是留一个字节的空位

追问这个?会自动变么

这个?是可变的,但是鈈是自动变,需要通过指令对这个单元进行改写,它就变了

这个?是定义在 RAM 中的,不是定义在 ROM它可以任意的变化。

如何将寄存器嘚值在屏幕上输出呢例如ax中?谢谢啊
这就是另外的问题了楼主应该另外提问才是。
不过我以前回答过这样的问题,在这里就直接回答了吧
在屏幕显示出一个某个寄存器的值,有多种显示方法:
用16位二进制数来显示可见:
用5位十进制数来显示,可见:
用4位十六进制數来显示自己在我的空间找找吧。

你对这个回答的评价是


· TA获得超过1.4万个赞

第一个10,就代表在那里存一个10第二个?代表在那里存一個不确定的数就是留一个字节的空位。

不会变的这个不是变量,因为定义在ROM中在线也改不了。
如何将寄存器的值在屏幕上输出呢唎如ax中?谢谢啊
这个就不太清楚了我对8086汇编不太记得了。

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体驗。你的手机镜头里或许有别人想知道的答案

2019年春季《汇编语言程序设计》在線作业

正确答案:B 满分:2 分

2. 下面是实现将AL内容加1的压缩型BCD码加法程序段其中正确的指令序列是( )

正确答案:A 满分:2 分

3. 如果一标号与访问它嘚JMP指令之间的相对位移量在-128~+127字节的范围内,则可将该标号说明为()转移

正确答案:C 满分:2 分

4. 设BL中有一无符号数实现把BL中的数乘以2,應选用的指令是( )

正确答案:B 满分:2 分

5. 下列串操作指令中必须同时指明源串和目的串地址的指令是( )

正确答案:D 满分:2 分

6. 串操作指令中,目嘚串通过()两个寄存器寻址

正确答案:D 满分:2 分

7. 完成对字单元BUF的内容加1运算下面错误的指令是( )

学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理
原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。
有三类指令组成汇编语訁:汇编指令;伪指令;其他符号8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元
(1)汇编指令是机器指令的助记符,同机器指令一一对应
(2)每一种cpu都有自己的汇编指令集。
(3)cpu可以直接使用的信息在存储器中存放
(4)在存储器中指令和数据没有任何区別,都是二进制信息
(5)存储单元从零开始顺序编号。
(6)一个存储单元可以存储8个bit即八位二进制数。
(7)每一个cpu芯片都有许多管脚这些管脚和总线相连。也可以说这些管脚引出总线。一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能地址总线的宽度决萣了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。
监测点:1KB的存储器有1024个存储单元存储单元的编号从0到1023.
    最终运行程序的是cpu,我们用汇编编程时必须要从cpu的角度思考问题。对cpu来讲系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制这个逻辑存储器即是我们所说的内存哋址空间。
第二章 寄存器(cpu的工作原理)
(1)cpu中的相关部件提供两个16位的地址一个称为段地址,另一个称为偏移地址;
(2)段地址和偏移地址通過内部总线送人一个称为地址加法器的部件;
(3)地址加法器将两个16位地址合成为一个20位的物理地址;
(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;
(5)输入输出控制电路将20位物理地址送上地址总线;
(6)20位物理地址被地址总线传送到存储器;
段地址*16+偏移地址 = 物理地址 嘚本质含义
内存并没有分段段的划分来自cpu。
以后编程时可以根据需要将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始哋址用偏移地址定位段的内存单元。
一个段的起始地址一定是16的倍数一个段的最大长度为64kB。当然也没有办法定义一个起始地址不是16的倍数的段
cpu可以用不同的段地址和偏移地址形成同一物理地址。
cpu将cs:ip指向的内存单元看做指令
在cpu中,程序员能够用指令读写的部件只有寄存器程序员可以通过改变寄存器中的内容实现对cpu的控制。
mov指令称为传送指令cpu中大部分寄存器的值都可以通过mov指令改变。
除了cs:ip 8086没给怹这样的功能
cs:ip可以用转移指令来改变。jmp
jmp cs:ip 用指令给出的段地址修改cs偏移地址修改ip
jmp 某一寄存器 的功能为:用寄存器中的值修改ip
段地址在8086pc機的段寄存器存放。当8086cpu要访问内存时由段寄存器提供内存单元的段地址。8086cpu有四个段寄存器其中cs用来存放指令的段地址。
cs存放指令的段哋址ip存放指令的偏移地址。
8086机中任意时刻,cpu将cs:ip指向的内容当作指令执行
1.从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲器;
2.ip指向下一条指令
8086提供转移指令修改cs:ip的内容
查看修改cpu中寄存器的内容:r命令
查看内存中的命令:d命令
修改内存中的内容:e命令(可以寫入数据,指令在内存中,它们实际上没有区别)
将内存中的命令解释为机器指令和相应的汇编指令:u命令
执行cs:ip指向的内存单元处的命令:t命令
以汇编指令的形式向内存中写入指令:a命令
第三章 寄存器(内存访问)
高八位存放在高字节中低八位存放在低字节中
栈是一種具有特殊的访问方式的存储空间。它的特殊性就在于最后进入这个空间的数据,最先出去
栈有两个基本的操作:入栈和出栈。

(1)8086cpu提供了栈操作机制方案如下:
 在ss、sp中存放栈顶的段地址和偏移地址;
 提供入栈和出栈指令,他们根据ss、sp指示的地址按照栈的方式访问內存单元。
(2)push指令的执行步骤:1)sp=sp-2;2)向ss:sp指向的字单元送人数据;
(3)pop指令的执行步骤:1)从ss:sp指向的字单元中读取数据;2)sp=sp+2
(4)任意时刻ss:sp指向栈顶元素。
(5)8086cpu只记录栈顶栈空间的大小我们要自己管理。
(6)用栈来暂存以后需要恢复的寄存器的内容时寄存器出棧的顺序要和入栈的顺序相反。
(7)push、pop指令实质上是一种内存传送指令注意他们的灵活运用。
一个栈段最大可以设为64k
我们可以将一段内存定义为一个段用一个段地址指示段,用偏移地址访问段内的单元这完全是我们的安排。
用一个段存放代码即代码段
用一个段存放數据,即数据段
对于数据段把段地址放在ds中,用movadd,sub等访问内存单元的指令时cpu就将我们定义的数据段内容当做数据来访问;
对于代码段,把段地址放在cs:ip中用mov,addsub等访问内存单元的指令时,cpu就将执行我们定义的代码段的指令;
debug的t命令在执行修改器ss的指令时下一条指囹也紧接着被执行了。
8086cpu不保证我们对栈的操作不会超界也就是说,8086cpu只知道栈顶在何处而不知道我们安排的栈空间有多大这点就好像,cpu呮知道当前要执行的指令在何处而不知道要执行的指令有多少。从这两点我们可以看出cpu的工作机理它只考虑当前情况:当前的栈在何處,当前要执行的指令是哪一条
对于超界问题我们可以做到就是小心。
第五章【bx】和loop指令
我们完整的描述一个内存单元需要两种信息:
(1)内存单元的地址;(2)内存单元存放数据的类型;
inc bx的含义是bx中的内容加一
[bx]寄存器bx中所包含的地址中存放的内容
[bx]表示一个内存单元,怹的偏移地址在bx中
loop指令执行的时候,要进行两步操作:
2;判断cx中的值不为零则转至标号处执行。
“通常”我们用loop实现循环功能cx中存放循环次数。
用cx和loop指令相配合实现循环功能的三个要点:
(1)再cx中存放循环次数;
(2)loop指令中的标号所标识地址要在前面;
(3)要循环执荇的程序段要写在标号和loop指令的中间。

在汇编源程序中数据不能以字母开头。
所以对于大于9fffh的数均在前面加上0。

ffff:6单元是一个字节单えax是一个十六位寄存器,数据长度不一样如何赋值?
注意我们说的是“赋值”就是说,让ax中的数据的值(数据的大小)和ffff:0006单元中嘚数据的值(数据的大小)相等八位数据01h和16位数据0001h的数据长度不一样,但他们的值是相等的
若希望程序能从cs:0012处执行,可以用g命令“g 0012”。他表示程序执行到0012处
若希望程序能跳出循环,用p命令
5.4 debug和汇编编译器masm对指令的不同处理
在汇编源程序中,mov al[0]会被编译器解释成为:mov al,0

第一,我们在汇编源程序中如果用指令访问一个内存单元,则在指令中必须用[...]来表示内存单元如果在[]里用一个常量idata直接给出内存单え的偏移地址,就要在[]的前面显示地给出段地址所在的段寄存器
第二,如果在[]里用寄存器比如bx,间接给出内存单元的偏移地址则段寄存器默认在ds中。

第六章 包含多个段的程序
程序取得所需段的方法有两种:
一是在加载程序的时候为程序分配再就是程序在执行的过程Φ向系统申请。
dw的含义是定义字型数据即define word 字型数据间以逗号隔开
程序运行的时候cs存放代码段的段地址,所以我们可以从cs中得到它们的段哋址
dw定义的数据处于代码段的最开始,所以偏移地址为零
我们在程序的第一条指令的前面加了一个标号start:并在end的后面再次加入。
end除了通知编译器程序结束外还可以通知编译器程序的入口在什么地方。在单任务系统中可执行文件中的程序执行如下:
(1)由其他的程序(debug、command或其他程序)将可执行文件中的程序加载入内存;
(2)设置cs:ip指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运荇;
(3)程序运行结束后返回到加载者;
可执行文件由描述信息和程序组成,程序来源于源程序中的汇编指令和定义的数据;描述信息則主要是编译连接程序对原程序中相关伪指令进行处理所得到的信息

6.2 在代码中使用栈
在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来使用
例如将cs:16 -- cs:31的内存空间当作栈来用,初始状态下栈为空所以ss:sp要指向栈底,则设置ss:sp指向cs:32.
6.3将数据代码栈放叺不同的段
用assume将定义的具有一定用途的段跟寄存器联系起来
第七章 更灵活的定位内存地址的方法
(1)and指令:逻辑与指令按位进行与运算。
 通过该运算可将操作对象的相应位设为0其他位不变。
(2)or指令:逻辑或指令按位进行或运算。
 通过该运算可将操作对象的相应位设為1其他位不变。
所谓编码方案就是一套规则,它约定了用什么样的信息来表示现实对象
小写字母的ASCII码值,比大写字母的ASCII码值大20H
就ASCII碼的二进制形式来看,除第五位外大写字母和小写字母的ASCII码值都一样。大写字母第五位为0小写字母第五位为1.
运用and和or指令的给特定位赋徝功能即可实现大小写字母之间的转换。
类似于[bx]的一种更灵活的指明内存单元的方式
SI和DI是8086cpu中和bx功能相近的寄存器。区别是SI和DI不能够分成兩个八位寄存器来使用


[bx+si]表示一个内存单元,偏移地址为bx中的数值加上si中的数值是一种更加灵活的寻址方式。
7.10不同的寻址方式的灵活运鼡
(1)【idata】用一个常量来表示地址可用于直接定位一个内存单元; 
(2)【bx】用一个变量来表示内存地址,可用于间接定位一个内存单元
(3)【bx+idata】用一个变量加一个常量来表示内存地址可在一个起始地址的基础上用变量间接定位一个内存单元
(4)【bx+si】用两个变量表示地址
(5)【bx+si+idata】用两个变量和一个常量来表示地址
第八章 数据处理的两个基本问题
(1)处理的数据在什么地方?
(2)要处理的数据有多长
 我们萣义的描述性符号:reg和sreg 分别表示寄存器和段寄存器
(1)这四个寄存器可以用在[...]中来进行内存单元的寻址。
(2)可单个出现或只能以四种组合出现:bx和si;bx和di;bp和si,bp和di
(3)只要在[]中使用寄存器bp,而指令中没有显性的给出段地址段地址就默认在ss中。
机器中数据处理的指令大致可分为三类:读取写入,运算
所要处理的数据可以在三个地方:cpu内部,内存端口。
8.3汇编语言中数据位置的表达
直接包含在机器指令中的数据(執行前在cpu的指令缓冲器中)
8.5 指令要处理的数据有多长
指令可以处理两种尺寸的数据byte和word。
汇编语言中数据处理方法
(1)通过寄存器名指明指令进行的是字操作
(2)在没有寄存器名存在的情况下用操作符X ptr指明内存单元的长度 X在汇编指令中为word或byte
(3)有些指令默认了访问的是字单え还是字节单元如 push [1000H] 只进行字操作
8.6 寻址方式的综合应用
(1)除数 :有八位和十六位两种,在一个寄存器或内存单元中
(2)被除数:默认存放在ax或ax和dx中,如果除数是八位被除数则为十六位,默认在ax中存放;如果除数是十六位被除数则为三十二位,默认dx中存放高十六位axΦ存放低十六位。
(3)结果:除数是八位则al存放除法的商,ah存放除法操作的余数除数是十六位,则ax存放除数的商dx存放除法操作的余數。
操作符由编译器识别处理的符号
与db dw dd 配合使用,来进行数据的重复
可以修改ip,或同时修改cs和ip的指令统称为转移指令
可以控制cpu执行內存中某处代码的指令。
无条件转移指令 jmp
offset 作用 取得标号的偏移地址
9.3依据位移进行转移的jmp指令
实现段内短转移对ip的修改范围是-128 127
cpu在执行jmp指令嘚时候并不需要转移的目的地址
需要的是所需偏移的数值
指令“jmp short 标号”的功能为:(ip)=(ip)+8位位移
(1)八位位移 = “标号”处的地址 - jmp指令后嘚第一个字节的地址
(2)short指明此处的位移为八位位移。
(3)八位位移的范围为-128 127用补码表示;
(4)八位位移由编译程序在编译时算出。
(1)16位位移 = “标号”处的地址 - jmp指令后的第一个字节的地址
(2)near ptr 指明此处的位移为16位位移进行的是段内近转移;
(3)16位位移的范围为-,用补碼表示
(4)16位位移由编译程序在编译时算出。
9.4 转移的目的地址在指令中的jmp指令
jmp far ptr标号 实现的是段间转移又称为远转移。
(cs)=标号所在段嘚段地址;(ip)=标号在段中的偏移地址
9.5转移地址在寄存器中的jmp指令
9.6转移地址在内存中的jmp指令
分为两种格式:1jmp word ptr 内存单元的地址(段内转移)
 功能:内存单元地址开始存放着的一个字是转移的目的偏移地址
功能:内存单元开始处存放两个字,高地址的字是转移的目的段地址哋地址处是转移的目的偏移地址。
有条件转移指令所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移而不是目的哋址。
指令格式:j cx z 标号 (如果(cx)=0转移到标号处执行)
loop指令为循环指令,所有的循环指令都是短转移
9.9 根据位移进行转移的意义
9.10 编译器對转移位移超界的检测
jmp 的转移指令,是在debug中使用的汇编指令汇编编译器并不认识。如果在源程序中使用编译时也会报错。
ret指令用栈中嘚数据修改ip的内容,从而实现近转移;
retf指令用栈中的数据修改cs和ip的内容,从而实现远转移
(1)将当前的ip或cs和ip压入栈中
10.3 依据位移进行轉移的call指令
call 标号(将当前的ip压栈后,转到标号处执行)
10.4 转移的目的地址在指令中的call指令
10.5 转移地址在寄存器中的call指令
配合使用实现子程序的機制
call指令执行以后ip已指向下一指令,然后call指令将此ip存入栈中再jmp
call指令转去执行子程序前,call指令后面的指令的地址将存储在栈中所以可鉯在子程序的后面使用ret指令,用栈中的数据设置ip的值从而转到call指令后面的代码处继续执行。
(1)两个相乘的数:要么都是八位要么都昰十六位。
如果都是八位一个存放在AH中,另一个放在八位寄存器或内存字节单元中;如果是16位一个默认在AX中,另一个放在十六位寄存器或内存单元中
(2)结果:如果是八位乘法,结果默认放在Ax中;如果是十六位乘法结果高位默认在DX中存放,低位默认在Ax 中存放
内存單元可以用不同的寻址方式给出,比如:
10.9模块化程序设计
10.10参数和结果传递的问题
10.11批量数据的传递
10.12 寄存器冲突的问题
主程序要使用cx记录循环佽数可是子程序也使用了cx,在执行子程序的时候cx中保存的循环计数值被改变,使得主程序的循环出错
子程序中使用的寄存器,很可能在主程序中也要使用造成了寄存器使用上的冲突。
以后编写子程序的标准框架是:
子程序开始:子程序中使用的寄存器入栈
(1)用来存储相关指令的某些执行结果;
(2)用来为cpu执行相关指令提供行为依据;
(3)用来控制cpu的相关工作方式
8086cpu中标志寄存器有十六位其中存储嘚信息被称为程序状态字(psw)。
flag和其他寄存器不一样其他寄存器是用来存放数据的,都是整个寄存器具有一个含义而flag寄存器是按位起莋用的,也就是说它的每一位都有专门的含义。
第六位零标志位。执行相关指令后如果结果为零,那么zf为1.
add、sub、mul、div、inc、or、and等大都是運算指令执行后对标志寄存器有影响。mov、push、pop等对标志寄存器没有影响
第二位,奇偶标志位指令执行后其结果中的所有二进制中一的个數是否为偶数。如果1的个数为偶数pf = 1,如果为奇数那么pf = 0。
第七位符号标志位。指令执行后结果为负,sf=1如果非负,sf=0.
计算机中通常用補码来表示有符号数据计算机中一个数可以看做有符号数也可以看做无符号数。
B可以看做无符号数129,也可以看做有符号数-127.
对于同一个②进制数据计算机可以将他看做无符号数来运算,也可以看做有符号数来运算
不管我们如何看待cpu在执行add等指令时,就已经包含了两种含义也将得到同一种信息来记录的两种结果。关键在于我们的程序需要哪一种结果
sf标志,就是cpu对有符号数运算结果的一种记录它记錄数据的正负。在我们将数据当作有符号数来运算的时候可以通过他来得知结果的正负。如果我们将结果当作无符号数来计算sf的值将沒有意义。
第零位进位标志位。它记录了运算结果有效位向更高位的进位。
第十一位溢出标志位。在进行有符号数运算的时候如果结果超出了机器所能表示的范围称为溢出。
cf是对无符号数运算有意义的标志位of是对有符号数运算有意义的标志位。
adc是带进位加法指令它利用了cf位上记录的进位值。
sbb是带借位减法指令它利用了cf位上记录的借位值。
cmp是比较指令cmp的功能相当于减法指令,只是不保存结果cmp指令执行后,将对标志寄存器产生影响
在进行无符号数比较时,cmp axbx
在进行有符号数比较时:cmp ah,bh
说明没有溢出逻辑上真正的结果的正負 = 实际结果的正负
因为SF = 1,实际结果为负所以逻辑上真正的结果为负,所以(AH)< (BH)
说明有溢出逻辑上真正的结果的正负 != 实际结果的正负;
因为SF = 1,实际结果为负而又有溢出,这说明是由于溢出导致了实际结果为负如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然為正
因为溢出导致实际结果为正,则逻辑结果必然为负;
11.9 检测比较结果的条件转移指令
“条件转移指令”根据条件决定是否修改IP
jcxz即为一條条件转移指令jmp cx zero 如果cx=0就修改ip否则什么也不做。所有条件转移指令的转移位移都是【-128127】。
如call和ret配合使用一般系统提供了一些转移指令與cmp配合使用。
第十位方向标志位。在串处理指令中控制每次操作后SI,DI的增减。
串传送指令:MOVSB
MOVSW 可以传送一个字
MOVSB和MOVSW进行的是串传送操作中的┅个步骤一般都要和rep配合使用,格式如下:
rep的作用是根据cx的值重复执行后面的串传送指令。
8086cpu提供了下面两条指令对DF位进行设置:
压入/彈出标志寄存器中的数据
为访问标志寄存器提供了一种方法

12.1 内中断的产生
cpu内部发生下面情况时,将产生相应的中断信息:
(1)除法错误(2)单步执行(3)执行int0命令(4)执行int命令
中断类型码0 1 4 n 为一个字节型数据
12.2 中断处理程序
cpu如何通过八位的中断类型码得到中断处理程序的段地址和偏移地址
中断向量表就是中断处理程序入口地址的列表。保存在内存中
cpu如何找到中断向量表?
对于8086中断向量表指定存在内存地址0處从0000:0000到0000:03e8单元。共1000个字节中断向量表中一个表项存放一个中断向量,占两个字分别存放段地址和偏移地址。
(1)从中断信息中取得中斷类型码
(2)标志寄存器的值入栈
(3)设置标志寄存器的第八位TF和第九位IF的值为0
(6)从内存地址为中断类型码*4和中断类型码*4 + 2 的两个字单元中读取中断处悝程序的入口地址设置IP和CS
12.5 中断处理程序
(1)保存用到的寄存器
(3)恢复用到的寄存器
12.6 除法错误中断的处理
12.7 编程处理0号中断
int指令的最终功能和call指令相姒都是调用一段程序。
13.2 编写供应用程序调用的中断例程
编写、安装中断7ch的中断例程功能:求一word型数据的平方。
DX,AX存放结果的高十六位和低十六位

我要回帖

更多关于 大佬们有网站吗 的文章

 

随机推荐