当前位置:网站首页>2021.11.10汇编考试

2021.11.10汇编考试

2022-07-06 09:17:00 劲腰傩舞

随便记录一下,比较零散

储存器寻址方式的区别

2.指令MOV AX, [BX+DI]中源操作数的寻址方式是:( d )(5分)
A. 寄存器间接寻址
B. 寄存器寻址
C. 寄存器相对寻址
D. 基址变址寻址

①对于储存器寻址来说
可用来寻址的寄存器有
基址寄存器:bp和bx
变址寄存器: bi和si
两个变址寄存器不可以同时使用
②寄存器间接寻址意味着只用寄存器的内容来充当偏移地址:[bx]
③寄存器寻址中的“相对”寻址意味着在寄存器的基础上加一个偏移量:[bx+666]

两种符号扩展指令

3.执行指令“MOV AL, 85H”和“CBW”后,AX寄存器的内容是:( c )(5分)
A. 85H
B. 0085H
C. FF85H
D. 85F0H

①有两个符号扩展指令:cbw和cwd
按照我自己的理解方式
cbw:convert Byte to Word
这个指令可以将al这个数扩展到ax
cwd:convert Word to Double
这个指令可以将ax这个数扩展到dx.ax
所以,符号扩展指令的本质其实是类型的转换
②符号位扩展的方式比较简单,直接看该寄存器中的二进制编码方式,最高位如果是1,就扩展1,0就0

db指令定义字符串

4.数据段中定义一个变量VAR DB ‘12345678H’,执行指令“MOV CL,VAR+3”后,CL寄存器内容为:(b)(5分)
A. 12H
B. 34H
C. 56H
D. 78H

①db后面想要定义数字的话,大小不可以大于一个字节。如果定义字符串,那么会按照字符串从左到右的顺序,从低地址往高地址存字符,每个字符占用一个字节,那么,var+3之后,正好指向’4’这个字符,这个时候,查一下ascii表,符号‘4’对应的ascii码是34h

取出一个段的段地址

6.汇编语言中可以作为程序员自定义标识符使用的是:( a )(5分)
A. done
B. idiv
C. xlat
D. @data

@data取出数据段的段地址。比如,mov ax,@data
一种更普适的方法是
通过mov bx,offset var1获得偏移地址
通过mov ds,seg var1获得段地址

SF和OF标志位

7.若AX=1234H,执行指令“ADD AX,7802H”后,AX寄存器的内容和标志位CF,SF,ZF,OF的状态是:(b)(5分)
A. AX=8A36H CF=0 SF=1 ZF=1 OF=0
B. AX=8A36H CF=0 SF=1 ZF=0 OF=1
C. AX=9036H CF=0 SF=1 ZF=1 OF=0
D. AX=9036H CF=0 SF=1 ZF=0 OF=1

①OF: overflow flag。在考虑这个标志位的时候,需要把被加数和加数当成有符号数,也就是说,被加数和加数都是以补码形式存在的,进行相加之后,结果超出了16位补码最大的正数:0fff,即表示溢出,OF设置为1。也就是说,在考虑某个标志位的取值的时候,需要从计算机的角度而非你存放的数据的实际意义去考虑。
②SF:sign flag符号标志.结果的最高位是啥,SF就是啥
③SF和OF在进行有符号运算的时候有意义,但是在进行无符号运算的时候也会有值的变换。
④PF:奇偶标志位,PF会让该标志位和运算结果中的1的个数是奇数,即若运算结果中有奇数个1,则pf为0

带借位的减法指令sbb

12.若AX=1020H, BX=1200H, CF=1,则指令“SBB AX, BX”的执行结果为:(b)(5分)
A. 0FE20H
B. 0FE1FH
C. 0FE21H
D. 01DFH

sbb指令需要考虑上次计算残留的借位,同时,本次计算如果借位了也需要修改CF的值。理论上,结果是ax-bx-cf,但是ax不够减,所以又要进行一次借位,即(F+1)020-1200-1=FE1F。因为这次计算借位了,那么完成之后,设cf=1

寄存器的第x位指的是哪个

14.已知(AL)=56H,若将AL的第0, 2, 6位变反而其它位保持不变,则使用指令( ) AL, BL; 其中(BL)=( a )。(5分)
A. XOR 45H
B. OR 45H
C. XOR 0A2H
D. AND 0BBH

从右往左开始第一位为第0位

立即数寻址和直接寻址的区别

①立即数寻址指的是一个数直接存放在指令中
②而直接寻址是一种储存器寻址,直接通过一个符号或者偏移量定位到内存单元,比如,mov ax,var或者mov ax,[var]

段寄存器和mov指令的配合

①在教材中,段寄存器的缩写是seg
②在汇编语言中,段寄存器有以s结尾的各种寄存器ds cs ss es
③在mov指令中,段寄存器不可以和立即数寻址结合在一起,即不允许:mov seg,imm

dosbox中的标志位怎么看

实验报告里的贴这里吧
在这里插入图片描述

一些常见指令对标志位的影响

①对循环指令的记忆,rcl中有一个c,代表这个指令需要考虑CF,即这是一个带进位的左循环指令
②rcl或者rol这些循环指令都影响CF,循环被挤出的数字会存放在CF中
③位运算指令and,or,xor这些指令都会直接将of和cf置0,原因不详,主要是不同指令在设计的时候有其具体的目的,对标志位的影响能力都不同,所以就先记住吧,应付下考试
④mov指令不影响标志位,主要用来传送数据
⑤利用test指令测试一个数是否是负数,或者判断其是否为零。例如,test ax,ax.因为test指令的本质是and指令,区别在于test指令操作数,但是影响zf和sf标志位,test ax,ax的结果是ax本身,如果ax是零,那么会置zf=1,如果ax是负数,那么会置sf=1

各种指令寻址的区别

①从直观上区分和数据寻址的区别,就是,数据寻址涉及的指令是mov,而指令寻址涉及的指令是各种跳转语句jmp loop等等
②指令寻址的目的都是跳转到特定的位置,本质上都是修改cs:ip的数据(cs:ip的内容是下一条指令的地址),根据修改cs:ip的方式,可以将其分为近转移,短转移,远转移
③根据是否修改cs的内容,又分为段内寻址和段间寻址
④近转移就是所谓的相对寻址,也是一种段内寻址,例如jmp labl1(labl1是一个标号,比如labl1:mov ax,1)或者是jmp near ptr lablq,或者是loop指令,近转移的做法就是在当前的ip值上加一个位移量,限制在于位移量的大小在+127~-128字节
⑤短转移可能是直接寻址或者寄存器间接寻址或者储存器间接寻址,也是一种段内寻址,例如jmp short ptr labl1或者jmp ax或者jmp [ax],短转移的做法就是直接将标号labl1的有效地址或者寄存器的内容赋给ip
⑥远转移的做法就是同时修改cs:ip,是一种段间寻址,例如jmp far ptr labl1
⑦各种分类的依据不同,其实记的的时候不用在一个分类中再分类,记住依据就行了,上述那么做也只是为了加深一下理解啦

堆栈传递参数注意事项

①在调用一个子程序之前想要添加一些入口参数,即在调用call指令之前使用push指令,需要注意的是,call指令本身也会向栈中压入东西,即返回的地址
②一般来说,我们在子程序中使用ret指令返回主程序,这个指令为我们做的就是,弹出返回地址,用这个返回地址去设置cs:ip,但此时别忘了,堆栈的栈顶还是之前放入的入口参数,所以一般来说,使用堆栈传递参数的时候,需要用ret i16指令进行返回,这个指令相当于,ret之后,sp+i16,即调低栈顶指针至没有添加入口参数的位置

原网站

版权声明
本文为[劲腰傩舞]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Abider2/article/details/121197224