4.1.10
1、操作数的三种基本类型是什么?立即操作数、寄存器操作数、内存操作数
2、(真假)mov指令的目的操作数不能为段寄存器。假
3、(真假)mov指令中的第二个操作数是目的操作数。假
4、(真假)eip寄存器不能作为mov指令的目的操作数。真
5、Interl使用的操作数符号中,reg/mem32的含义是什么?32位通用寄存器或内存操作数
6、Interl使用的操作数符号中,imm16的含义是什么?16位立即操作数
4.2.8
问题1~问题5使用如下数据:
1 .data 2 val1 byte 10h 3 val2 word 8000h 4 val3 dword 0ffffh 5 val4 word 7fffh
1、编写一条指令实现val2加1。
1 inc val2
2、编写一条指令实现从eax中减去val3。
1 sub eax,val3
3、编写指令实现从val2中减去val4。
1 mov ax,val4 2 sub val2,ax
4、如果用add指令实现val2加1,则进位标志位和符号标志位的值是什么?
1 mov eax,1
2 add val2,eax ; val2=8001h, cf=0 sf=1
5、如果用add指令实现val4加1,则溢出标志位和符号标志位的值是什么?
1 mov eax,1
2 add val4,eax ; val4=8000h, of=1 sf=1
6、如有下程序段,每条指令执行后,写出进位标志位、符号标志位、零标志位和溢出标志位的值:
mov ax,7ff0h add al,10h ;a. cf=1 sf=0 zf=1 of=0 add ah,1 ;b. cf=0 sf=1 zf=0 of=1
add ah,2 ;c. cf=0 sf=1 zf=0 of=0
4.3.8
1、(真假)offset运算符总是返回一个16位的数值。假
2、(真假)ptr运算符返回变量的32位地址。假
3、(真假)对双字操作数,type运算符返回值位4。真
4、(真假)lengthof运算符返回操作数的字节数。假
5、(真假)sizeof运算符返回操作数的字节数。 真
4.4.5
1、(真假)任何一个32位通用寄存器都可以用作间接操作数。真
2、(真假)ebx寄存器通常是保留的,用于寻址堆栈。假
3、(真假)指令inc[esi]是非法的。真
4、(真假)array[esi]是变址操作数。真
问题5~问题6使用如下数据定义:
1 mybytes byte 10h,20,30,40h 2 mywords word 8ah,3bh,72h,44h,66h 3 mydoubles dword 1,2,3,4,5
4 mypointer dword mydoubles
5、有如下指令序列,填写右侧要求的寄存器的值。
1 mov esi,offset mybytes 2 mov al,[esi] ;a. al=10h
3 mov al,[esi+3] ;b. al=40h
4 mov esi,offset mywords + 2
5 mov ax,[esi] ;c. ax=003bh
6 mov edi,8
7 mov edx,[mydoubles + edi] ;d. edx=3
8 mov edx,mydoubles[edi] ;e. edx=3
9 mov ebx,mypointer 10 mov eax,[ebx+4] ;f. eax=2
6、有如下指令序列,填写右侧要求的寄存器的值。
1 mov esi,offset mybytes 2 mov ax,[esi] ;a. ax=2010h
3 mov eax,dword ptr mywords ;b. eax=3b8ah
4 mov esi,mypointer 5 mov ax,[esi+2] ;c. ax=0
6 mov ax,[esi+6] ;d. ax=0
7 mov ax,[esi-4] ;e. ax=0044h
4.5.6
1、(真假)jmp指令只能跳转到当前过程中的标号。真
2、(真假)jmp是条件跳转指令。假
3、循环开始时,如果ecx初始化为0,那么loop指令要循环多少次?(假设在循环中,没有其他指令修改ecx。)ecx=-1=ffffffffh,循环4294967296次
4、(真假)loop指令首先检查ecx是否等于0,然后ecx减1,再跳转到目标标号。假
5、(真假)loop指令执行过程如下:ecx减1;如果ecx不等于0,loop跳转到目标标号。真
6、实地址模式中,loop指令使用哪一个寄存器作计数器?cx
7、实地址模式中,loopd指令使用哪一个寄存器作计数器?ecx
8、(真假)loop指令的跳转目标必须在距离当前地址256个字节的范围内假(-128-+127字节)
9(挑战)程序如下所示,eax最后的值是多少?eax=1ch
1 mov eax,0
2 mov ecx,10 ;外层循环计数器 3 l1: 4 mov eax,3
5 mov ecx,5 ;内层循环计数器 6 l2: 7 add eax,5
8 loop l2 ;重复内层循环 9 loop l1 ;重复外层循环
修改上题代码,使得内层循环开始时,外层循环计数器不会被擦除。
1 mov eax,0
2 mov ecx,10 ;外层循环计数器 3 l1: 4 mov eax,3
5 mov ecx,5 ;内层循环计数器 6 push ecx 7 l2: 8 add eax,5
9 loop l2 ;重复内层循环 10 pop ecx 11 loop l1 ;重复外层循环
4.6.4
1、(真假)将常数值0ffh送入rax寄存器,将清除其位8-位63。真(位8~位63清零)
2、(真假)一个32位常数可以被送入64位寄存器中,但是64位常数不可以。假
3、执行下列指令后,rcx的值是多少?rcx=12345678ffffffffh
1 mov rcx,1234567800000000h 2 sub ecx,1
4、执行下列指令后,rcx的值是多少?rcx=12345678ababababh
1 mov rcx,1234567800000000h 2 add rcx,0ababababh
5、执行下列指令后,al寄存器的值是多少?al=1fh
1 .data 2 barray byte 10h,20h,30h,40h,50h 3 .code 4 mov rdi,offset barrya 5 dec byte ptr[rdi+1] 6 inc rdi 7 mov al,[rdi]
6、执行下列指令后,rcx的值是多少?rcx=e002h
1 mov rcx,0dfffh 2 mov bx,3
3 add cx,bx
4.9.1 简答题
1、执行下列标记为(a)和(b)的指令后,edx的值分别为多少?
1 .data 2 one word 8002h 3 two word 4321h 4 .code 5 mov edx,21348041h 6 movsx edx,one ;(a). edx=ffff8002h
7 movsx edx,two ;(b). edx=00004321h
2、执行下列指令后,eax的值是多少?eax=10020000h
1 mov eax,1002ffffh 2 inc ax
3、执行下列指令后,eax的值是多少?eax=3002ffffh
1 mov eax,30020000h 2 dec ax
4、执行下列指令后,eax的值是多少?eax=10020001h
1 mov eax,1002ffffh 2 neg ax
5、执行下列执行后,奇偶标志位的值是多少?pf=0
1 mov al,1
2 add al,3
6、执行下列指令后,eax和符号标志位的值分别是多少?eax=-1,sf=1
1 mov eax,5
2 sub eax,6
7、下面的代码中,al为一字节有符号数。说明,在判断al最终结果是否在有符号数的有效范围内时,溢出标志位是否有用,若有用,是如何起作用的?
-1=0ffh,130=82h,0ff已经是一字节最大值,所以它减去82h时,of标志位为0,也说明了al的值没有溢出,在有效范围内。
1 mov al,-1
2 add al,130
8、执行下列指令后,rax的值是多少?eax=0000000044445555h
1 mov eax,44445555h
9、执行下列指令后,rax的值是多少?rax=0000000084326732h
1 .data 2 dwordval dword 84326732h 3 .code 4 mov rax,0ffffffff00000000h 5 mov rax,dwordval
10、执行下列指令后,eax的值是多少?eax=00035678h
1 .data 2 dval dword 12345678h 3 .code 4 mov ax,3
5 mov word ptr dval+2,ax 6 mov eax,dval
11、执行下列指令后,eax的值是多少?eax=12341237h
1 .data 2 .dval dword ?
3 .code 4 mov dval,12345678h 5 mov ax,word ptr dval+2
6 add ax,3
7 mov word ptr dval,ax 8 mov eax,dval
12、(是否)正数与负数相加时,是否可能使溢出标志位置1?否
13、(是否)两负数相加,结果为正数,溢出标志位是否置1?是
14、(是否)执行neg指令是否能将溢出标志位置1?是
15、(是否)符号标志位和零标志位是否能同时置1?否
问题16~19使用如下变量定义:
1 .data 2 var1 sbyte -4,-2,3,1
3 var2 word 1000h,2000h,3000h,4000h 4 var3 sword -16,-42
5 var4 dword 1,2,3,4,5
16、判断下述每条指令是否为有效指令:
1 mov ax,var1 ? ;n
2 mov ax,var2 ;y 3 mov eax,var3 ;n 4 mov var2,var3 ;n 5 movzx ax,var2 ;n 6 movzx var2,al ;n 7 mov ds,ax ;y 8 mov ds,1000h ;y
17、顺序执行下列指令,则每条指令目标操作数的十六进制值是多少?
1 mov al,var1 ;a. al=eh
2 mov ah,[var1+3] ;b. ah=0ffh
18、顺序执行下列指令,则每条指令目标操作数的值是多少?
1 mov ax,var2 ;a. ax=1000h
2 mov ax,[var2+4] ;b. ax=2000h
3 mov ax, var3 ;c. ax=-16
4 mov ax,[var3-2] ;d. ax=0
19、顺序执行下列指令,则每条指令目标操作数的值是多少?
1 mov edx,var4 ;a. edx=1
2 movzx edx,var2 ;b. edx=00001000h
3 mov edx,[var4+4] ;c. edx=2
4 movsx edx,var1 ;d. edx=11111011
4.9.2
1、有一个变量名为three的双字变量,编写一组mov指令来交换该变量的高位字和低位字。
1 .data 2 three dword 12345678h 3 .code 4 mov ax,word ptr three 5 mov bx,word ptr [three+2] 6 mov word ptr three,bx 7 mov word ptr [therr+2],ax 8 mov eax,three
2、用不超过3条的xchg指令对4个8位寄存器的值进行重排序,将其顺序从a、b、c、d调整为b、c、d、a。
1 .data 2 abyte byte a 3 bbyte byte b 4 cbyte byte c 5 dbyte byte d 6 .code 7 mov al,abyte 8 mov bl,bbyte 9 mov cl,cbyte 10 mov dl,dbyte 11 xchg al,dl 12 xchg bl,cl
3、被传输的信息通常包含有一个奇偶位,其值与数据字节结合在一起,使得1的位数为偶数。设al寄存器中信息字节的值位01110101,如何用一条算术运算指令和奇偶标志位判断该信息字节是偶校验还是奇校验?
4、编写代码,用字节操作数实现两个负整数相加,并使溢出标志位置1。
5、编写里连续的两条指令,用加法使零标志位和进位标志位同时置1。
6、编写连续的两条指令,用减法使进位标志位置1。
7、用汇编语言实现算术表达式:eax=-val2+7-val3+val1。假设val1、val2、和val3都是32位整数变量。
8、编写循环代码,在一个双字数组中进行迭代。用带比例因子的变址寻址,计算该数组元素的总和。
9、用汇编语言实现算术表达式:ax=(val2+bx)-val4。假设val2和val4都是16位整数变量。
10、编写连续的两条指令,是进位标志位和溢出标志位同时置1。
11、编写指令序列,说明在执行inc和dec指令后,如何用零标志位来判断无符号溢出情况。
问题12~问题18使用如下数据定义:
1 .data 2 mybytes byte 10h,20h,30h,40h 3 mywords word 3 dup(?),2000h 4 mystring byte "abcde"
12、在给定数据中插入一条伪指令,将mybytes对齐到偶地址。
13、下列每条指令执行后,eax的值分别是多少?
1 mov eax,type mybytes ;a. eax=
2 mov eax,lengthof mybytes ;b. eax=
3 mov eax,sizeof mybytes ;c. eax=
4 mov eax,type mywords ;d. eax=
5 mov eax, lengthof mywords ;e. eax=
6 mov eax,sizeof mywords ;f. eax=
7 mov eax,siezeof mystring ;g. eax=
14、编写一条指令将mybytes的前两个字节送入dx寄存器,使寄存器的值位2010h。
15、编写一条指令将mywords的第二个字节送入al寄存器。
16、编写一条指令将mybytes的全部四个字节送入eax寄存器。
17、在给定数据中插入一条label伪指令,使得mywords能直接送入32位寄存器。
18、在给定数据中插入一条label伪指令,使得mybytes能直接送入16位寄存器。
4.10
下面的联系可以在32位模式或64位模式下完成。
1、将大端顺序转换为小端顺序
使用下面的变量和mov指令编写程序,将数值从大端顺序复制为小端顺序,颠倒字节的顺序。32位数的十六进制值位12345678。
1 .data 2 bigendian byte 12h,34h,56h,78h 3 littleendian dword ?
2、交换数组元素对
编写循环程序,用变址寻址交换数组中的数值对,每对中包含偶数个元素。即,元素i与元素i+1交换,元素i+2与元素i+3交换,以此类推。
3、数组元素间隔之歌
编写循环程序,用变址寻址计算连续数组元素的间隔总和。数组元素为双字,按非递减次序排列。比如,数组为{0,2,5,9,10},则元素间隔为2、3、4、和1,那么间隔之和等于10。
4、将字数组复制到双字数组
编写循环程序,把一个无符号字(16位)数组的所有元素复制到无符号双字(32位)数组。
5、斐波那契数列
编写循环程序,计算斐波那契(fibonacci)数列前七个数值之和,算式如下:
fib(1)=1,fib(2)=1,fib(n)=fib(n-1)+fib(n-2)
6、数组反向
编写循环程序,用间接或变址寻址实现整数数组元素的位置颠倒。不能将元素复制到其他数组。考虑到数值大小和类型在将来可能发生变化,用sizeof、type和lengthof运算符尽可能增加程序的灵活性。
7、将字符串复制为相反顺序
编写循环程序,用变址寻址将一个字符串从源复制到目的,并实现字符的反向排序。变量定义如下:
1 source byte "this is the source string",0
2 target byte sizeof source dup('#')
8、编写循环程序,用变址寻址把一个32位整数数组中的元素向前(向右)循环移动一个位置,数组最后一个元素的值移动到第一个位置上。比如,数组[10,20,30,40]移位后转换为[40,10,20,30]。