一些汇编课程的小题目,一个小题给10分,10个小题

1个回答

  • 1. 汇编指令实际是机器指令便于记忆的书写格式,汇编指令的写法与人类语言接近,便于阅读和记忆,实际在代码运行之前,汇编指令都会经过编译器被编译成二进制数据,计算机只接受二进制数据. 2. 数据的存放原则是:低地址存放低字节,高地址存放高字节 一个字由两个字节组成,这两个字节分别称为这个字的高位字节和地位字节.一个字可以存在一个16为寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8为寄存器和低8位寄存器中. 3.一共有七个属性操作符,每个属性操作符都有固定的意思. 变量是一个符号地址,其值会根据其数据类型来对应从该地址以后的若干个存储单元中所存的数值.标号也是一个符号地址,它所对应的存储单元中存放的是指令代码.虽然它们在某些性质上有所不同,但它们都是一个符号地址,代表一个存储单元的地址,所以,它们都具有存储单元的属性.除此之外,它们还有各自特殊的属性. 1、段属性操作符 段属性操作符(SEG)返回该标识符所在段的段地址.我们一般只会取内存变量所在段的段地址,而很少取标号所在段的段地址. 假设有下面变量定义: SCORE DW ? NAME DB 10 DUP(10) ;数据段的变量定义 … MOV AX, SEG SCORE ;代码段的指令 MOV BX, SEG NAME 由于SCORE和NAME在同一段中定义,所以,寄存器AX和BX的值是相等的. 2、偏移量属性操作符 偏移量属性操作符(OFFSET)返回该标识符离它所在段的段地址有多少字节.一般情况,程序员只会取内存变量的偏移量,而不太关心标号的偏移量. 假设有下面变量定义: FIRST DD 12345678H, 0 ;数据段的变量定义 SCORE DW ?, 12H NAME DB 10 DUP(10) … MOV AX, OFFSET SCORE ;代码段的指令 MOV BX, OFFSET NAME … 假设FIRST是数据段的第一个被定义的变量名,它的偏移量为0,SCORE的偏移量为8,因为它要跳过二个双字,其它如此类推. 由于NAME在SCORE之后,且SCORE之后有二个字,占四个字节,所以,BX的值要比AX的值大4. 3 类型属性操作符 类型属性操作符(TYPE)是返回该变量所占字节数,或标号的“远”(FAR)、“近”(NEAR)类型. 标识符种类---TYPE的值 字节变量-----:1 字变量------:2 双字变量-----:4 近标号(NEAR)---:-1 远标号(FAR)----:-2 例如: PEASON STRUC NO DD ? NAME DB 10 dup (?) DW 1 PEASOM ENDS … B1 DB 1, 2, 3 W1 DW 200 DUP(1,2,30 DUP(10,20)), 101H, -1 PEOPLE PEASON 按属性TYPE的含义,TYPE B1、TYPE W1和TYPE PEOPLE的值分别为:1,2和16. 4、长度属性操作符 长度属性操作符(LENGTH)是针对内存变量的操作符,它返回重复操作符DUP中的重复数.如果有嵌套的DUP,则只返回最外层的重复数;如果没有操作符DUP,则返回1. 如上例所示,根据属性LENGTH的含义,LENGTH B1、LENGTH W1和LENGTH PEOPLE的值分别为:1,200和1. 5、容量属性操作符 容量属性操作符(SIZE)也是针对内存变量的操作符.它的返回值按下列公式计算: SIZE 变量 = (LENGTH 变量) × (TYPE 变量) 如上例所示,SIZE B1、SIZE W1和SIZE PEOPLE的值分别为:1,400和16. 6、强制属性操作符 在程序中,我们有时需要对同一个存储单元以不同的属性来访问,或对一些不确定的存储属性需要显式指定等,这时,我们就需要强制属性操作符PTR.该操作符的作用有点象C语言中的类型强制方法. 对于指令:MOV [BX], 1H,其目标操作数[BX]是寄存器间接寻址方式,它指向一个存储单元.在作传送操作时,是把“1H”扩展成8位作字节传送,还是扩展成16位作字传送呢?这就使该指令具有二义性,因为[BX]指向的存储单元可以字节或字的首地址.含有该指令的程序在汇编时,可能会产生警告或出错信息. 为了使指令中存储单元操作数具有明确的属性,我们可以使用强制属性操作符PTR.其一般格式为: 数据类型 PTR 地址表达式 其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等. 为了明确指令中存储单元的属性,可把指令“MOV [BX], 1H”可改写成: MOV byte ptr [BX], 1H 或 MOV word ptr [BX], 1H 在指令中用操作符PTR强制后,不管其后的地址表达式原数据类型是什么,在本指令中就以PTR前面的类型为准.该强制属性只在本指令有效,是一种临时性的属性,它不会改变原内存单元的定义属性. 例如: W1 DW 1234H, 5678H B1 DB 2 DB 5 D1 DD 23456789H … MOV AX, word ptr b1 ;把B1开始的二个字节拼接成一个字,执行后,(AX)=0502H MOV BH, byte ptr w1 ;把字W1的低字节传送给BH,执行后,(BH)=34H MOV CH, byte ptr w1+1 ;把字W1的高字节传送给CH,执行后,(CH)=12H MOV word ptr d1, 12H ;把双字D1的低字修改成0012H,执行后,(D1)=23450012H 上面指令中的强制属性是临时属性,它不能改变这些变量在定义时的永久属性. 7、存储单元别名操作符 由上一节的内容,我们知道:在程序中,如果需要以另一种数据类型来访问某一存储单元时,可用强制属性操作符PTR来实现.但如果在程序中要经常以某种其它的数据类型来访问该存储单元的话,那么,就必须在每次访问时都要加上强制属性操作符PTR.这样做虽然可行,但在编写程序时就显得比较麻烦. 为了克服上述不便,汇编语言提供了另一种操作符THIS,它为同一存储单元取另一别名,该别名可具有其自身的数据属性,但其段地址和偏移量是不变的. 操作符THIS的一般格式为: THIS 数据类型 其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等. 例如: WBUFFER EQU THIS WORD ;EQU是一个等价符号定义语句. BUFFER DB 20 DUP(?) 这样就给同一片存储单元,取了二个具有不同数据类型的变量名.于是,在指令中,引用不同的变量名,就使用其不同的数据属性: * 如果引用变量名WBUFFER,则是按“字”属性来访问; *如果引用变量名BUFFER,则是按“字节”属性来访问. 如此一来,指令“MOV AX, word ptr BUFFER”和“MOV AX, WBUFFER”是等效的,所不同的是:当以“字”属性访问BUFFER存储区时,不必使用强制属性符PTR,而改用“字”属性变量WBUFFER即可 4.存储器操作数三个方面的属性如下: (1) 段地址:即存储器操作数所对应的存储单元所在段的段地址 (2) 偏移地址:即存储器操作数所对应存储单元在所在段内的偏移地址 (3) 类型:变量的类型是相应存储单元所存放的数据项的字节数;而标号的类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,可有两种情况,即NEAR和FAR 5. 16位无符号二进制数能表示的范围是 0 至 2^16-1,有符号数的范围我正在学习中,以前没有注意到这个问题,我再复习一下 6.xor用于寄存器清零动作,根据"相异则或,相同则零"的运算法则进行计算. 7.汇编结束伪指令 END,该伪指令表示源程序的结束.令汇编程序停止汇编. 一般格式为:END [表达式] 8. 这个题目和第五题差不多,我再复习一下有符号数,这个问题我暂时还不知道,见谅! 9. 标志寄存器中有CF、PF、ZF、SF、OF、DF标志位 ZF是零标志位,PF是奇偶标志位,SF是符号标志位,CF是进位标志位,OF是溢出标志位,DF是方向标志位 10.8086的CPU有16根地址线,也就说它能寻址的存储空间为2的16次方. 8086CPU工作模式分为大小模式,大小模式是决定CPU寻址能力的,实模式(最小模式)只能寻1M吧,保护模式(最大模式)用G来评价,而CPU的地址总线的位数决定了这些.计算机上电后,机器状态字的PE位清0,只有低20位地址线是有效的,所以只有1M的空间,在程序的控制下CPU进入保护模式其于的地址线才有效,就拿32位的CPU来说,2的32次方这么大的空间是实模式不能比拟的. 对于以上回答如有错误的地方,望广大网友指出,本人将感激不尽!

    满意请采纳