32位汇编语言程序设计第6、7章习题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题6
2.指出下面转移指令的类型(相对近转移,相对短转移,间接转移)。

.DATA
addrS t ore DWORD ?
.CODE
……
again:
……
(3 instructions)
jmp again;短转移
……
(200 instructions)
……
jmp again ;近转移
……
jmp addrStore;段内间接转移
……
jmp eax ;段内间接转移
……
jmp [edi] ;段内或段间间接转移
3.代码段有以下指令:
ADD EAX, EBX
JNO L1
JNC L2
SUB EAX, EBX
JNO L3
JNC L4
JMP SHORT L5
如果EAX和EBX的内容如下:
(1)EAX=0102147BH,EBX=120180DCH ;L1
(2)EAX=12348756H,EBX=800080DCH ;L1
(3)EAX=D0230000H,EBX=9FD0000H ;L3
(4)EAX=94B70000H,EBX=B568000H ;L1
指令执行完后,程序怎样转移?
4.假设EAX和EBX的内容是无符号数,ECX和EDX的内容是有符号数,请用比较指令实现以下判断:
(1)如果EDX的内容大于ECX的内容,则转去执行L1;
cmp edx, ecx
jg L1
(2)如果EAX的内容大于EBX的内容,则转去执行L2;
cmp eax, ebx
ja L2
(3)如果ECX=0,则转去执行L3;
cmp ecx, 0
jz L3

jecxz L3
(4)EAX-EBX是否会发生溢出,如果发生溢出则转去执行L4;
sub eax, ebx
jo L4
(5)如果EBX的内容小于EAX的内容,则转去执行L5;
cmp ebx, eax
jb L5
(6)如果ECX的内容小于EDX的内容,则转去执行L6。

cmp ecx, edx
jl L6
5.已知EAX=0000004FH,V ALUE= FFFFFF38H。

请指出下面每一个语句是否会引起转移?
(a) cmp eax, value
jl dest; N
(b) cmp eax, value
jb dest; Y
(c) cmp eax, 04fh
je dest ; Y
(d) cmp eax, 79
jne dest; N
(e) cmp value,0
jbe dest; N
(f) cmp value,-200
jge dest ;Y
(g) cmp eax, 200
js dest; y
(h) add value,200
jz dest; N
6.编写程序测试STA TUS中的状态:如果STATUS=0,则转去执行L0;如果D0,D3,D5位为1则转去执行L1;如果D31,D29为0则转去执行L2;如果D15,D14,D13为1,则转去执行L3。

test status, FFFFH
jz L0
test status , 29H
jne L1
test status, C0000000H
jz L2
test status, 00e00000H
jne L3
7.指出下面每一个循环的循环次数:
(a) mov ecx,10
again: ……
loop again
10
(b) mov ecx,1
again: ……
loop again
1
(c) mov ecx,0
again: ……
loop again
4294967296
(c) mov ecx,-1
again: ……
loop again
4294967295
习题7
1.子程序定义的一般格式是怎样的?子程序入口为什么常有PUSH指令、出口为什么有POP指令?下面的程序段有什么不妥吗?若有,请改正。

crazy PROC
push ax ;删去
xor ax,ax
xor dx,dx
again: add ax,[bx]
adc dx,0
inc bx
inc bx
loop again
;增加pop ax
ret
endp crazy ;crazy endp
答:name proc
;保存寄存器
;指令
;恢复寄存器
ret
name endp
push指令和pop指令通常用于保护和恢复寄存器
3.下面的指令执行后的结果是什么?
(3)ESP=0000F83AH,EAX=12345678H
PUSHW 30
POP BX
POP ECX
ECX=? ESP=? EAX=? BX=?
答:esp=000083Ah-4-2+2+4=000083AH, bx=30, ecx=12345678H, eax不变pushw和pushd助记符强制汇编器生成16位或32位代码
4.假设主程序中有子程序调用语句:CALL Myproc。

如果这条call指令所在地址是00402000h,esp=00406000h,这条call指令执行后,堆栈中保存的返回地址是多少?ESP=?
答:返回地址:00402005h
esp=00405ffch
call的时候要把当前指令的下一个指令的EIP压栈,以便执行完能返回接着下面的执行。

然后把EIP设置成要调用的函数的地址。

也就是说,call之后,首先将下一条指令的地址保存在栈顶,然后设置EIP指向被调用程序代码开始处。

5.子程序返回值为EAX,在程序的入口和返回处是否可以用PUSHAD和POPAD来保存和恢复寄存器?
答:不可以
9.请按如下子程序说明编写子程序。

;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数
;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码
;出口参数:AL=对应的二进制数
答:decTobin proc
push cx
and dh,0fh ;先转换十位数
shl dh,1 ;十位数乘以10(采用移位指令)
mov ch,dh
shl dh,1
shl dh,1
add dh,ch
and dl,0fh ;转换个位数
add dh,dl ;十位数加个位数
mov al,dh ;设置出口参数
pop cx
ret
decTobin endp
10.写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换。

欲转换的字符串在string中,用0表示结束。

答:convert proc
mov ebx, 1
jne next
;大写变小写
A1: mov bl, string[ebx] inc ebx
cmp bl, 41h
jb A1
cmp bl, 5ah
ja A1
xor bl, 20h
mov string[ebx],bl
cmp bl, 20h
jz endpro
jmp A1
next:
cmp al, 1
jne next1
;小写变大写
A2: mov bl, string[ebx]
inc ebx
cmp bl, 61h
jb A2
cmp bl, 7ah
ja A2
xor bl, 20h
mov string[ebx],bl
cmp bl, 20h
jz endpro
jmp A2
next1:
cmp al, 2
jne endpro
;大小写互换
A3: mov bl, string[ebx] inc ebx
cmp bl, 41h
jb A3
cmp bl, 5ah
jbe c1
cmp bl, 61h
jb A3
cmp bl, 7ah
ja A3
C1: xor bl, 20h
mov string[ebx],bl
cmp bl, 20h
jz endpro
jmp A2
endpro:
ret
convert endp
18.编写子程序判断一个字符串是不是十进制字符串。

如果是,EAX=0;如果不是,EAX=1。

答:isDecDigit proc uses edx,char:byte
;判断是否为十进制字符
;入口参数char=输入字符的ASCII码
;出口参数eax=0是十进制字符,eax=1不是十进制字符
xor eax, eax
mov edx, char
cmp edx,'0'
jb L1
cmp edx,'9'
jbe L2
L1:
mov eax, 1
L2:
ret
isDecDigit endp。

相关文档
最新文档