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]。