• 42.50 KB
  • 2022-04-22 11:48:33 发布

《IBM-PC汇编语言程序设计 第二版》部分习题答案(第5章).doc

  • 19页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart: pushdx movax,0 pushax  movah,01H int21H  cmpal,61H  jllop1  cmpal,7BH jgelop1  subal,20H movdl,al  lop1:movah,2 int21H  retEndstart 5.2编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符..modelsmall.386.codeMAINPROCFARstart: pushds subax,ax pushax input: movah,7H int21Hcmpe:  cmpal,20H JE exit  cmpal,61H JL input  cmpal,7AH JG inputprint: subal,01H movdl,al movah,02H int21H   addal,01H movdl,al movah,02H int21H  addal,01H movdl,al movah,02H int21H  ;输出换行回车 movdl,0AH movah,02H int21H jmpinputexit: retMAINENDPENDstart5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。.modelsmall.dataxDB4dup(?).stack100H.codeMAINPROCFARstart:  pushds andax,00H pushax  movax,1234H  movcx,04H movsi,00Hlop: pushcx mov cl,04H rolax,cl pushax andal,0FH movBYTEPTRx[si],al popax popcx addsi,2 Looplop moval,[X] movbl,[X+2] movcl,[X+4] movdl,[X+6]print: movah,02H int21H  movdl,al movah,02H  int21H  movdl,bl movah,02H int21H movdl,cl movah,02H int21Hexit: retMAINENDPENDstart5.4编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NOMATCH"。.modelsmall.dataSTRING1DB"Imuststudyhard"STRING2DB"Imuststudyhard"X      DB"MATCH.$"Y      DB"NOMATCH.$".stack100H.codemainprocfarStart: pushdx movax,0 pushax   movax,@data movds,ax moves,ax  leasi,STRING1 leadi,STRING2 cld  movcx,(string2-string1)/typeSTRING2 retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。modelsmall.codemainprocfarstart: pushds subax,ax pushaxinput:        movah,01H        int21H        cmpal,20H        je exit         cmpal,30H        jleinput        cmpal,3AH        jgeinput        subal,30H        movcx,ax        andcx,0FFHlop:        movdl,07H        movah,2H        int21H        looplop        jmpinputexit:        retmainendpendstart5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。.modelsmall.386.dataMDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10PDB20dup(?)NDB20dup(?).codeMAINPROCFARstart:   PUSHds  AND ax,0  PUSHax    MOV ax,@data  mov ds,ax  MOV bx,0  MOV si,0  MOV di,0  MOV cx,20D  cmpe :  CMP M[bx],0  JL ifLowhight:  MOV al,byteptrM[bx]  MOV byteptrP[si],al  inc si  JMP commonContrlifLow:  MOV al,byteptrM[bx]  MOV byteptrN[di],al  INC dicommonContrl:  INC bx  loopcmpe  mov ax,si  callshowNumber  callprintCR   mov ax,di  callshowNumberexit: retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOV dx,ax  MOV cl,2Hshow:  ROL dl,4H  pushdx  AND dl,0fH  ADD dl,30H  MOV ah,02H  int 21H  pop dx  loopshow  retshowNumberENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;printCRPROCNEAR  movdl,0aH  movah,02H  int21H  movdl,0dH  movah,02H   int21H  retprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。    此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....dataaresegmentDATADW3322H,4555H,200H,3544H,1245Hnum DB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dataareMAINPROCFARstart:  pushds  mov ax,0H  pushax    mov ax,dataare  mov ds,ax  mov dx,0H              ;偶数数量计数  mov cx,Wordptr[num]  mov si,0HisO:  mov bx,WORDPTRDATA[si]   shr bx,1H  jnc addDX  jmp commonControladdDX:  ADD dx,1H  cmp dx,1H  je  firstAXValuecompare:  mov bx,WORDPTRDATA[si]  cmp bx,ax  jge commonControl  mov ax,bxcommonControl:  ADD si,2H  loopisO  jmp exitfirstAXvalue:  movax,WORDPTRDATA[si]  jmpcompareexit:  retMAINENDPcodeendsENDstart5.8没有做。。5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。.model small.386.codemainprocfarstart: pushds mov ax,0 pushax  mov ax,0 mov cx,4 mov dx,0input: mov ah,1H int 21H cmp al,30H jl  input   cmp al,39H   jle s cmp al,61H jl  input cmp al,66H jg  input sub al,27Hs: sub al,30H add dl,al cmp cx,1H je  f rol dx,4 f:  loopinputexit: callprint retmainendpprintprocnear movcx,10Hp:            rol dx,1 pushdx and dx,1 add dx,30H mov ah,2 int 21H pop dx looppretprintendpendstart 5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUNXXXX"显示出次数。.modelsmall.386.data ENG    db"SUN"sSUNJAVA",24H ;;;;24H=$ MESSAGEdb"SUN:","$".stack 100H.codeMAINPROCFARstart:  PUSHDS  AND AX,0  PUSHAX    MOV AX,@data  MOV DS,AX  ;------------------------  MOV AX,0H  MOV SI,1HsubSI1:  SUB SI,1HsubSI2:  SUB SI,1HcompareS:  ADD SI,1H  MOV DL,ENG[SI]  CMP DL,24H  JE  print  CMP DL,53H  JNE compareScompareU:  ADD SI,1H  MOV DL,ENG[SI]  CMP DL,55H  JNE subSI2compareN:  ADD SI,1H   MOV DL,ENG[SI]  CMP DL,4EH  JNE subSI1  INC AX  JMP comparesprint:  LEA DX,MESSAGE  PUSHAX  MOV AH,09H  INT 21H  POP AX  callshowNumberexit:  retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOV dx,ax  MOV cl,4Hshow:  ROL dx,4H  pushdx  AND dx,0fH  ADD dx,30H  MOV ah,02H  int 21H   pop dx  loopshow  retshowNumberENDPENDstart 5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。.modelsmall.386.codeMAINPROCFARstart:  pushds  mov ax,0  pushax    mov cx,0input:  mov ah,1H  int 21Hcompare:  cmp al,24H  je  print  cmp al,30H  jl  addCount  cmp al,39H  jg  addCountaddCount:  add ax,1H   jmp inputprint:  callshowNumberexit: retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOV dx,ax  MOV cl,2Hshow:  ROL dl,4H  pushdx  AND dl,0fH  ADD dl,30H  MOV ah,02H  int 21H  pop dx  loopshow  retshowNumberENDPENDstart5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。.modelsmall.386.stack 100H.datamemdw12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2.codeMAINPROCFARstart:  pushds  and ax,0  pushax    mov ax,@data  mov ds,ax;----------------------  mov ax,0H  mov bx,64H  mov cx,64H  mov si,0FFFEHrepeat:  ADD si,2H  cmp MEM[si],0H  JE  calls  looprepeatcalls:  INC ax  callsort  cmp ax,1H   JE  lastValue  DEC cx  jmp repeatexit:  retlastValue:  mov mem[bx],0H  DEC cx  jmp repeat  MAINENDPsortPROCNEAR pushcx pushsi sub si,2Hs: add si,2H mov dx,mem[si] mov mem[si+2],dx loopsreturn: popsi popcx retsortENDPENDstart'