精品文档
可以使得条件成立、发生转移的指令有:JC JS JP JNZ JNO
〔习题4.8〕在采用奇偶校验传输数据的接收端应该验证数据传输的正确性。例如,如果采用偶校验,那么在接收到的数据中,其包含“1”的个数应该为0或偶数个,否则说明出现传输错误。现在,在接收端编写一个这样的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在Rdata变量中。 〔解答〕 ; 数据段 Rdata byte 57h ;保存接收的数据 error byte 'Error !',0 ; 代码段 mov al,Rdata and al,0ffh ;标志PF反映“1”的个数 jp done ;个数为偶数,正确继续 mov eax,offset error ;个数为奇数,显示出错 call dispmsg done:
〔习题4.10〕编程,首先测试双字变量DVAR的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”。 〔解答〕 ; 数据段 dvar dword 57h ; 代码段 mov eax,dvar test eax,80000000h jnz nextl test eax,1 jnz nextr mov al,'M' jmp done nextl: mov al,'L' jmp done nextr: mov al,'R' done: call dispc
收集于网络,如有侵权请联系管理员删除
精品文档
〔习题4.11〕编写一个程序,先提示输入数字“Input Number:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。
〔解答〕 ; 数据段
inmsg byte 'Input number(0~9): ',0
ermsg byte 0dh,0ah,'Error! Input again: ',0 ; 代码段 mov eax,offset inmsg ; 提示输入数字 call dispmsg again: call readc ; 等待按键 cmp al,'0' ; 数字 < 0? jb erdisp cmp al,'9' ; 数字 > 9? ja erdisp call dispcrlf call dispc jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again done:
〔习题4.12〕有一个首地址为ARRAY的20个双字的数组,说明下列程序段的功能。
mov ecx,20 mov eax,0 mov esi,eax
sumlp: add eax,array[esi] add esi,4 loop sumlp mov total,eax 〔解答〕
求这20个双字的和,保存在TOTAL变量,不关进心进位和溢出。
收集于网络,如有侵权请联系管理员删除
精品文档
〔习题4.13〕编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在SPACE单元。
〔解答〕 ; 数据段
string byte 'Do you have fun with Assembly ?',0 ;以0结尾的字符串 space dword ? ; 代码段 mov esi,offset string xor ebx,ebx ;EBX用于记录空格数 again: mov al,[esi] cmp al,0 jz done cmp al,20h ;空格的ASCII码是20H jne next ;不相等、不是空格,转移 inc bx ;相等、是空格,空格个数加1 next: inc esi jmp again ;继续循环 done: mov space,ebx ;保存结果
〔习题4.14〕编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到WORDSUM,如超过则显示‘Overflow !’。
〔解答〕 ; 数据段
array word 2005,2008,98 dup (1394) ; 假设100个16位正整数 wordsum word ?
error byte 'Overflow !',0 ; 代码段 and ebx,0 mov ecx,100 xor ax,ax
again: add ax,array[ebx*2] jc over inc ebx loop again mov wordsum,ax
over: mov eax,offset error
收集于网络,如有侵权请联系管理员删除
精品文档
call dispmsg
〔习题4.15〕在一个已知长度的字符串中查找是否包含“BUG”子字符串。如果存在,显示“Y”,否则显示“N”。
〔解答〕 ; 数据段
string byte 'If you find any error in the program, you can DEBUG it.'
count = sizeof string bug byte 'BUG' ; 代码段 mov ecx,count mov edi,offset string L1: mov esi,offset bug push edi mov edx,sizeof bug LN: mov al,[esi] cmp [edi],al jne L2 inc esi inc edi dec edx jne LN pop edi mov al,'Y' jmp L3 L2: pop edi inc edi loop L1 mov al,'N' L3: call dispc
〔习题4.16〕主存中有一个8位压缩BCD码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导0。由于位数较多,需要利用循环实现,但如何处理前导0和数据中间的0呢?不妨设置一个标记。编程实现。 〔解答〕 ; 数据段 bcd dword 00371002h
收集于网络,如有侵权请联系管理员删除
精品文档
; 代码段 mov esi,bcd cmp esi,0 jnz goon mov al,'0' call dispc jmp done goon: mov ecx,8 xor ebx,ebx ; EBX=0,表示可能是前导0 again: rol esi,4 mov eax,esi and eax,0fh ; EAX低4位保存当前要显示的BCD码 cmp ebx,0 ; EBX≠0,说明不是前导0,要显示 jnz disp ; EBX=0,说明可能是前导0 cmp eax,0 jz next ; EAX=0,说明是前导0,不显示 mov ebx,1 ; EAX≠0,没有前导0了,令EBX=1≠0 disp: add al,30h call dispc next: loop again done:
〔习题4.17〕已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。
〔解答〕 ; 数据段
string byte 'Let us have a try !',0dh,0ah,0 ; 代码段 mov ecx,sizeof string cmp ecx,2 jb done lea eax,string ; 显示处理前的字符串 call dispmsg mov esi,ecx dec esi
outlp: cmp string[esi],' ' ; 检测是否是空格 jnz next ; 不是空格继续循环 mov edi,esi ; 是空格,进入剔除空格分支
收集于网络,如有侵权请联系管理员删除