小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

80X86匯編語言程序設(shè)計教程(楊季文)習(xí)題答案三

 晨々鐘 2012-03-03
分類: ASM 94人閱讀 評論(0) 收藏 舉報

第三章:
Tarzan版

 

題3.1  偽指令語句與指令語句的本質(zhì)區(qū)別是什么?偽指令的主要作用是什么?

答:   偽指令語句與指令語句的本質(zhì)區(qū)別是指令語句有其對應(yīng)的機(jī)器指令,而偽指令沒有;
       偽指令的主要作用是指示匯編程序如何匯編源程序;
      
題3.2  匯編語言中的表達(dá)式與高級語言中的表達(dá)式有何相同點和不同點?

答:   匯編語言中的表達(dá)式與高級語言中的表達(dá)式的相同點是都采用運算符、操作符以及括號
       把常數(shù)和符合連起來;
       不同點是匯編語言的表達(dá)式除了數(shù)值表達(dá)式外還有地址表達(dá)式;
      
題3.3  匯編語言中數(shù)值表達(dá)式與地址表達(dá)式有何區(qū)別?

答:   匯編語言中數(shù)值表達(dá)式在匯編過程中由匯編程序計算出數(shù)值,而地址表達(dá)式中部分相對地址
       的地方,在匯編時無法確定其確定地址;
      
題3.4  匯編語言中的變量和標(biāo)號有何異同之處?

答:   匯編語言中的變量和標(biāo)號的相同之處是都代表著一個地址;
       不同之處是變量表示的地址中存放的是數(shù)據(jù),而標(biāo)號表示的地址中存放的是代碼;
      
題3.5  請計算如下各數(shù)值表達(dá)式的值:
       23H AND 45H OR 67H
       1234H/16+10H
       NOT(65535 XOR 1234H)
       1024 MOD 7+3
       LOW 1234 OR HIGH 5678H
       23H SHL 4
       "Eb" GE 4562H XOR -1
       1234H SHR 6
       'a' AND (NOT ('a'-'A')
       'H' OR 00100000B
       76543Q LT  32768 XOR 76543
       3645H AND 0FF00H
      
答:   23H AND 45H OR 67H                ;67H
       1234H/16+10H                      ;133H
       NOT(65535 XOR 1234H)              ;1234H
       1024 MOD 7+3                      ;5
       LOW 1234 OR HIGH 5678H            ;D6H 注意1234 不是1234H
       23H SHL 4                         ;30H
       "Eb" GE 4562H XOR -1              ;0
       1234H SHR 6                       ;0048H
       'a' AND (NOT ('a'-'A')            ;41H or 'A'
       'H' OR 00100000B                  ;68H or 'h'
       76543Q LT  32768 XOR 76543        ;題目最后的76543有錯,按照76543Q處理:829CH
       3645H AND 0FF00H                  ;3600H
      
題3.6  請計算如下程序片段中各地址表達(dá)式的值,設(shè)BX=1000H,SI=2000H,DI=3000H,
       BP=4000H
       [BX+100H]
       [DI][BP]
       2000H[SI]
       10H[BX][SI]
       [BP-128]
       [BX][DI-2]
      
答:   [BX+100H]                         ;[1100H]
       [DI][BP]                          ;[7000H]
       2000H[SI]                         ;[4000H]
       10H[BX][SI]                       ;[3010H]
       [BP-128]                          ;[3F80H]
       [BX][DI-2]                        ;[3FFEH] 
      
題3.7  設(shè)在某個程序中有如下片段,請寫出每條傳送指令執(zhí)行后寄存器AX的內(nèi)容:
              ORG 100H
       VARW   DW  1234H,5678H
       VARB   DB  3,4
       VARD   DD  12345678H
       BUFF   DB  10 DUP(?)
       MESS   DB  'HELLO'
       BEGIN: MOV AX,OFFSET VARB + OFFSET MESS
              MOV AX,TYPE BUFF + TYPE MESS + TYPE VARD
              MOV AX,SIZE VARW + SIZE BUFF + SIZE MESS
              MOV AX,LENGTH VARW + LENGTH VARD
              MOV AX,LENGTH BUFF + SIZE VARW
              MOV AX,TYPE BEGIN
              MOV AX,OFFSET BEGIN
             
答:          ORG 100H
       VARW   DW  1234H,5678H
       VARB   DB  3,4
       VARD   DD  12345678H
       BUFF   DB  10 DUP(?)
       MESS   DB  'HELLO'
       BEGIN: MOV AX,OFFSET VARB + OFFSET MESS              ;AX=0218H
              MOV AX,TYPE BUFF + TYPE MESS + TYPE VARD      ;AX=0006H
              MOV AX,SIZE VARW + SIZE BUFF + SIZE MESS      ;AX=000DH
              MOV AX,LENGTH VARW + LENGTH VARD              ;AX=0002H
              MOV AX,LENGTH BUFF + SIZE VARW                ;AX=000CH
              MOV AX,TYPE BEGIN                             ;AX=FFFFH
              MOV AX,OFFSET BEGIN                           ;AX=0119H
      
題3.8  設(shè)如下兩條指令中的符號ABCD是變量名,請說明這兩條指令的異同。
       MOV AX,OFFSET ABCD
       LEA AX,ABCD
      
答:   兩條指令都是將ABCD的偏移地址放入AX寄存器中;
       不同之處是OFFSET只能取得用數(shù)據(jù)定義偽指令的變量的有效地址,而不能取得一般操作
       數(shù)的有效地址;
      
題3.9  請指出如下指令的不明確之處,并使其明確:
       MOV ES:[BP],5
       ADD CS:[1000H],10H
       DEC SS:[BX-8]
       JMP CS:[SI+1000H]
       MUL [BX+DI+2]
       DIV [BP-4]
      
答:   MOV ES:[BP],5                ;未指定存儲單元屬性 MOV WORD PTR ES:[BP],5
       ADD CS:[1000H],10H           ;同上 ADD WORD PTR CS:[1000H],10H
       DEC SS:[BX-8]                ;同上 DEC WORD PTR SS:[BX-8]
       JMP CS:[SI+1000H]            ;無法確定段間還是段內(nèi)轉(zhuǎn)移
                                      JMP WORD PTR CS:[SI+1000H]
       MUL [BX+DI+2]                ;無法確定是8位乘法還是16位乘法
                                      MUL WORD PTR [BX+DI+2]
       DIV [BP-4]                   ;同上 DIV WORD PTR [BP-4]
      
題3.10 設(shè)在某個程序中有如下片段,請改正其中有錯誤的指令語句:
       VARW   DW  1234H,5678H
       VARB   DB  3,4
       VARD   DD  12345678H
       ......
              MOV AX,VARB
              MOV VARD,BX
              MOV VARD+2,ES
              MOV CL,VARW+3
              LES DI,VARW
             
答:          MOV AX,VARB           ;VARB是8bit量,應(yīng)該修改AX到AL or AH
              MOV VARD,BX           ;VARD是32bit量,要分兩次傳
              MOV VARD+2,ES         ;同上
              MOV CL,VARW+3         ;同上,CL改為CX
              LES DI,VARW           ;VARW非32位量,應(yīng)改為VARD
             
題3.11  請舉例說明偽指令A(yù)SSUME的作用。

答:    ASSUME的作用是聲明現(xiàn)在開始CS寄存器對應(yīng)于哪個段,DS對應(yīng)于哪個段,SS和ES
        分別對應(yīng)哪個段,可以相同也可以不同;
        如:
        ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:ESEG
        可以根據(jù)需要重新建立對應(yīng)關(guān)系;
       
題3.12  設(shè)在某個程序片段中有如下語句,請說明各符號的屬性:
        SYMB1 LABEL BYTE
        SYMB2 EQU THIS BYTE
        SYMB3 DW ?
        SYMB4 EQU BYTE PTR SYMB3
       
答:    SYMB1:BYTE
        SYMB2:BYTE
        SYMB3:WORD
        SYMB4:BYTE

題3.13  為什么說匯編語言中的等價語句EQU可理解為簡單的宏定義?請舉例說明。

答:    EQU可以用符號定義常數(shù),表達(dá)式,指令助記符,字符串等;
        而宏定義是指定一個宏指令名,宏指令可表示相對應(yīng)的程序片段。
        如:
        HELLO EQU "How are you !"
        與:
        HELLO MACRO
        'How are you !'
        ENDM
       
        一致;
       
題3.14  設(shè)在某個程序片段中有如下語句,請說明各符號所表示的值:
        SYMB1 = 10
        SYMB2 = SYMB1*2
        SYMB1 = SYMB1 + SYMB2 + 4
        SYMB3 EQU SYMB1
       
答:    SYMB1 = 22H         
        SYMB2 = 14H
        SYMB3 = 22H     
               
題3.15  請改寫3.3.3的程序T3-1.ASM,使其只有一個段。

答:    ;程序名:T3-1.ASM
        ;功能  :顯示信息“HELLO"

        cseg segment
             assume cs:cseg
             mess  db 'HELLO',0dh,0ah,'$'
        start:
             mov ax,cseg
             mov ds,ax
             mov dx,offset mess
             mov ah,9
             int 21h
             mov ah,4ch
             int 21h            
        cseg ends
             end start 
            
題3.16  請說明指令”JMP $+2“指令的機(jī)器碼中的地址差值是多少?

答:    2H

題3.17  源程序是否一定要以END語句結(jié)束?程序是否一定從代碼段的偏移0開始執(zhí)行?
        如果不是,那么如何指定?
       
答:    源程序可以不以END語句結(jié)束,不過END之后的內(nèi)容匯編程序?qū)⒑雎浴?BR>        程序不一定要從代碼的偏移0開始執(zhí)行,一個比較簡單的方法是利用END語句,
        如END XXX,程序?qū)腦XX標(biāo)號處開始執(zhí)行;
       
題3.18  利用查表的方法實現(xiàn)代碼轉(zhuǎn)換有何特點?利用查表的方法求函數(shù)值有何特點?

答:    利用查表的方法實現(xiàn)代碼轉(zhuǎn)換的特點是:
        1、轉(zhuǎn)換代碼間不需要直接的算術(shù)或邏輯關(guān)系,只需要安排好表的組織即可;
        2、對于部分代碼,其轉(zhuǎn)換效率比較高,主要時間用在尋址上;
      
        利用查表的方法求函數(shù)值的特點是:
        1、對于大部分的數(shù)學(xué)函數(shù)值的求值,直接計算困難較大,采用查表法可禰補(bǔ)
        不足;
        2、程序比較簡單;
        3、能夠得到十進(jìn)制或者十六進(jìn)制格式的高精度函數(shù)值。
        4、函數(shù)值必須事先計算好;
        5、精度無法由程序控制;
       
題3.19  利用地址表實現(xiàn)多向分支有何特點?請舉例說明。

答:    利用地址表實現(xiàn)多向分支的特點有:
        1、對于實現(xiàn)5路以上的多向分支,使用地址表既方便又高效;
        2、對于如何確定地址的位置,需要采用不同的方法實現(xiàn);
        例子看書。
       
題3.20  請舉例說明如何避免條件轉(zhuǎn)移超出轉(zhuǎn)移范圍。

答:    如果出現(xiàn)條件轉(zhuǎn)移超出了范圍,則可以利用無條件轉(zhuǎn)移指令幫助跳轉(zhuǎn);
        如:
        cmp ax,'A'
        jb out_program
       
        如果超出范圍:
        cmp ax,'A'
        jb out_com
        ...
        out_com:   
        jmp far ptr out_program
       
題3.21  請寫一個程序片段統(tǒng)計寄存器AX中置1的個數(shù)。

答:   count db ?,?,0dh,0ah,'$'
       ... ...
       call countAX
      
       cmp bl,9
       ja sub10
       jmp go
sub10:
       sub bl,10
       mov count,31h
go:         
       add bl,30h
       mov count+1,bl
       mov dx,offset count
       mov ah,9
       int 21h
       mov ah,4ch
       int 21h
;==============================
        ;入口:AX
        ;出口:BL=AX中1的個數(shù)
        countAX proc
        mov cx,16
        mov bl,0
count1:    
        shl ax,1
        jnc ADDAX1
        add bl,1
ADDAX1:    
        loop count1
        ret 
        countAX endp        
;=============================                                                 
 
題3.22  設(shè)一個32位有符號數(shù)存放在DX:AX中,請寫一個求其補(bǔ)碼的程序片段。
              
答:    Invert proc
        mov bx,dx
        and bx,8000h
        cmp bx,0
        jz out_1
        not dx
        not ax
        add ax,1
        adc dx,0
        or  dx,8000h       
out_1:
        nop       
        ret
        Invert endp
       
題3.23  寫一個程序片段實現(xiàn)如下功能:依次重復(fù)寄存器AL中的每一位,得到16位的結(jié)果存
        放到DX寄存器中。
       
答:    Expand proc
        mov cx,7
        xor dx,dx
       
   S0: 
        shl dx,1
        shl dx,1
        shl al,1
        jnc CF0
        add dx,3h
   CF0:
        nop         
        loop S0
        ret
        Expand endp   
  
題3.24  寫一個程序片段實現(xiàn)如下功能:依次重復(fù)四次寄存器AL中的每一位,得到32位的結(jié)果
        存放到DX:AX寄存器中。
       
答:    Expand proc
        mov cx,3
        xor dx,dx
        xor bx,bx
   S0:
        shl al,1
        jnc CF0
        add dx,0Fh
   CF0:
        shl dx,1
        shl dx,1
        shl dx,1
        shl dx,1        
        loop S0
       
        mov cx,4
   S1:
        shl al,1
        jnc CF0_1
        add bx,0Fh
   CF0_1:
        shl bx,1
        shl bx,1
        shl bx,1
        shl bx,1        
        loop S1    
        mov ax,bx   
        ret
   Expand endp 
  
題3.25  寫一個程序片段實現(xiàn)如下功能:把寄存器AL和BL中的位依次交叉,得到的16位結(jié)果
        存放到DX寄存器中。
       
答:    Expand proc
        mov cx,8
        xor dx,dx
   S0:
        shl dx,1
        shl al,1
        jnc CF0
        add dx,1h
   CF0:
        shl dx,1
        shl bl,1
        jnc CF0_1
        add dx,1h
   CF0_1:      
        loop S0
        ret
        Expand endp 
       
題3.26  寫一個優(yōu)化的程序片段,實現(xiàn)把字符串中的小寫子母變換為對應(yīng)的大寫子母。設(shè)字符串
        以0結(jié)尾。
       
答:    InvertC proc
  begin:
        mov al,mess[si]
        cmp al,'0'
        jz exit_1   
        cmp al,61h
        jb next
        cmp al,7AH
        ja next
        and al,11011111b
        mov mess[si],al
 next:
        inc si
        jmp begin
exit_1:
        nop
        ret
        InvertC endp 
       
題3.27  寫一個優(yōu)化的程序片段,統(tǒng)計字符串的長度。設(shè)字符串以0結(jié)尾。

答:    count proc
        mov al,mess[si]
        cmp al,'0'
        jz exit_2
        inc si
        jmp count
   exit_2:
        nop
   ret
   count endp        ;si=數(shù)量
  
題3.28  寫一個程序片段,濾去某個字符串中的空格符號(ASCII碼20H),設(shè)字符串以0結(jié)尾。

答:    DeleteSpace proc     ;設(shè)si=0,bx=0,Mess為字符串首地址
        mov al,mess[si]
        cmp al,'0'
        jz exit_2
        cmp al,' '
        jz next3
        xchg al,mess[bx]
        xchg al,mess[si]
        inc bx
   next3:
        inc si  
        jmp DeleteSpace
   exit_2:
        nop
   ret
   DeleteSpace endp                                   

題3.29  請寫一個把兩個字符串合并的示例程序。

答:    dseg segment
        string1 db 'Welcome to $'
        string2 db 'Beijing !$'
   dseg ends
  
   cseg segment
        assume cs:cseg,ds:dseg
   start:
        mov ax,dseg
        mov ds,ax
       
        xor bx,bx
        xor si,si
       
   keepfind:
        mov al,string1[bx]
        cmp al,'$'
        jz combine
        inc bx
        jmp keepfind
   combine:
        mov al,string2[si]
        mov string1[bx],al
        cmp al,'$'
        jz exit
        inc si
        inc bx
        jmp combine
   exit:
    
        mov dx,offset string1
        mov ah,09h
        int 21h 
       
        mov ah,4ch
        int 21h
   cseg ends
        end start

題3.30  請寫一個可把某個字變量的值傳喚為對應(yīng)二進(jìn)制數(shù)ASCII碼串的示例程序。

答:    ;Name  : Show_hex_ascii
        ;input : ah=Hex
        ;output: dx='Hex'
        show_hex_ascii proc
       
               mov dh,ah
               and dh,0f0h        ;reserve high 4bit
               shr dh,4
               add dh,30h         ;change 0-9 to '0-9'
               cmp dh,39h
               ja add_dh_7       
        dh_ok:
               mov dl,ah
               and dl,0fh         ;reserve low 4bit
               add dl,30h
               cmp dl,39h
               ja add_dl_7
        dl_ok:
               nop
               ret      
        add_dl_7:
               add dl,7h           ;revert A-F to 'A-F'
               jmp dl_ok
       
        add_dh_7:
               add dh,7h
               jmp dh_ok
              
        show_hex_ascii endp

題3.31  請寫一個可把某個十進(jìn)制數(shù)ASCII碼串轉(zhuǎn)換成對應(yīng)非壓縮BCD何壓縮BCD的示例程序。

答:    ;非壓縮BCD碼
        ;Input  ah=十進(jìn)制數(shù)ASCII碼
        ;Output al=非壓縮BCD碼
        TEST1 proc
        cmp ah,'0'
        jb exit
        cmp ah,'9'
        ja exit
        sub ah,30h
        mov al,ah
 exit: 
        nop      
        ret
        TEST1 endp
       
        ;壓縮BCD碼
        ;Input  ax=兩個十進(jìn)制數(shù)ASCII碼
        ;Output bl=壓縮BCD碼
        TEST2 proc
       
        cmp ah,'0'
        jb exit
        cmp ah,'9'
        ja exit
        sub ah,30h
        mov bl,ah
        shl bl,4
       
        cmp al,'0'
        jb exit
        cmp al,'9'
        ja exit1
        sub al,30h
        add bl,al
exit1:
        nop       
        ret
        TEST2 endp

題3.32  請寫一個可把某個十進(jìn)制數(shù)ASCII碼轉(zhuǎn)換為對應(yīng)的二進(jìn)制的示例程序。

答:    table db '0000','0001','0010','0011','0100','0101','0110','0111'
              db '1000','1001'
        ......
        ;Input  bl=一個十進(jìn)制數(shù)ASCII碼
        ;Output dx:ax=二進(jìn)制ASCII碼
        ;程序未檢驗該十進(jìn)制數(shù)是否在范圍以內(nèi)
        TEST3 proc
        sub bl,30h
        xor bh,bh
        shl bx,1
        shl bx,1
        mov dh,table[bx]
        mov dl,table[bx+1]
        mov ah,table[bx+2]
        mov al,table[bx+3]
          
        ret
        TEST3 endp 
       
題3.33  請寫出一個可把某個十六進(jìn)制數(shù)ASCII碼轉(zhuǎn)換為對應(yīng)的二進(jìn)制的示例程序。

答:    table db '0000','0001','0010','0011','0100','0101','0110','0111'
              db '1000','1001','1010','1011','1100','1101','1110','1111'
        ... ...
        ;Input  bl=一個十六進(jìn)制數(shù)ASCII碼
        ;Output dx:ax=二進(jìn)制ASCII碼
        TEST3 proc
        cmp bl,30h        
        jb exit1         ;小于30H的不在范圍內(nèi)
        sub bl,30h       
        cmp bl,0Ah       ;如果在9以內(nèi),開始轉(zhuǎn)換0-9
        jb change1
       
        sub bl,0Ah
        cmp bl,6h        ;如果在‘9’-‘A’之間,不在范圍內(nèi)
        jb exit1
       
        sub bl,6h        ;‘A’=0
        cmp bl,7h        ;如果在‘A’-‘F’之間,開始轉(zhuǎn)換
        jb change2
       
        cmp bl,21h       ;如果大于‘F’,看是否在‘F’和‘a(chǎn)’之間
        jb exit1         ;如果在,則不在范圍內(nèi)
        sub bl,20h       ;'a'=0
        cmp bl,6h        ;如果大于‘f’,則不在范圍內(nèi)
        ja exit1      
change2:
        add bl,9h        ;按照table表,如果A=0還需要加9才可以
       
change1:       
        xor bh,bh
        shl bx,1
        shl bx,1
        mov dh,table[bx]
        mov dl,table[bx+1]
        mov ah,table[bx+2]
        mov al,table[bx+3]
exit1:         
        ret
        TEST3 endp     
       
       
題3.34  請寫一個實現(xiàn)數(shù)據(jù)塊移動的示例程序。

答:    data segment
        data1 db 'Hello!!!.....$'
        ....
        data2 db 128 dup(?)
        data ends
       
        ....
        xor ax,ax
        xor bx,bx
  mov1:    
        mov al,data1[bx]            
        cmp al,'$'
        jz out1
        mov data2[bx],al
        inc bx
        jmp mov1
       
 out1:
        ......
       
題3.35  請編一個程序求從地址F000:0000H開始的64K字節(jié)內(nèi)存區(qū)域的檢驗和,并轉(zhuǎn)換為
        十六進(jìn)制的數(shù)的ASCII碼串。
 
答:    ;F000:0000H 字檢驗和
        ;Output: BX=字檢驗和
        TEST5 proc
       
        mov ax,0F000H
        mov es,ax
       
        mov cx,0ffffh
        xor si,si
        xor bx,bx
  ADD0:
        add bx,es:[si]
        inc si
        inc si
        loop add0
          
        ret
        TEST5 endp
       
       
        table1  db '0','1','2','3','4','5','6','7','8','9'
                db 'A','B','C','D','E','F'       

        ;Input bx=字檢驗和
        ;Output dx:ax=字檢驗和ASCII碼
        TEST4 proc
        push cx
       
        mov cx,bx
        push cx
        mov cl,12
        shr bx,cl
        pop cx
        mov dh,table1[bx]
        mov bx,cx
        and bx,0F00h
        push cx
        mov cl,8
        shr bx,cl
        pop cx
        mov dl,table1[bx]
        mov bx,cx
        and bx,00f0h
        push cx
        mov cl,4
        shr bx,cl
        pop cx
        mov ah,table1[bx]
        mov bx,cx
        and bx,000fh
        mov al,table1[bx]
       
        mov bx,cx
        pop cx
        ret
        TEST4 endp
       
題3.36  設(shè)已在地址F000:0000H開始的內(nèi)存區(qū)域安排了100個字節(jié)的無符號8位二進(jìn)制數(shù)。
        請編寫一個程序求它們的和,并轉(zhuǎn)換為對應(yīng)十進(jìn)制數(shù)的ASCII碼串。
       
答:    ;從 F000:0000H開始100個byte無符號數(shù)相加
        ;output BX=Sum
        TEST6 proc
        push cx
        push ax
        push si
        mov ax,0f000h
        mov es,ax
        xor bx,bx
        xor si,si
        xor ax,ax
        mov cx,100
       
 ADD2:
        mov al,es:[si]         
        add bx,ax
        inc si
        loop ADD2
       
        pop si
        pop ax
        pop cx
        ret
        TEST6 endp
       
        ... ...
        Dec_ASC db '     $'     ;在數(shù)據(jù)區(qū)
        ... ...
       
        ;Name:Convert1
        ;function: Hex convert to Dec
        ;Input: BX=a word of Hex
        ;Output: DS:Dec_ASC
        Convert1 proc
        push ax
        push cx
        push dx
        mov ax,bx
        xor dx,dx
        mov cx,2710h            ;2710H=10000
        div cx
        add ax,30h
        mov dec_asc[0],al       ;[0]=萬位
        mov ax,dx
        xor dx,dx
        mov cx,3E8h             ;3E8H=1000
        div cx
        add ax,30h
        mov dec_asc[1],al       ;[1]=千位
        mov ax,dx
        mov cl,64h              ;64H=100
        div cl
        add al,30h
        mov dec_asc[2],al       ;[2]=百位
        mov al,ah
        mov ah,0
        mov cl,0ah              ;0A=10
        div cl
        add ax,3030h
        mov dec_asc[3],al       ;[3]=十位
        mov dec_asc[4],ah       ;[4]=個位
        pop dx
        pop cx
        pop ax
        ret
        Convert1 endp       


題3.37  設(shè)已在地址F000:0000H開始的內(nèi)存區(qū)域安排了1024個16位有符號數(shù)。請編寫一個程序
        統(tǒng)計其中的正數(shù)、負(fù)數(shù)和零的個數(shù),并分別轉(zhuǎn)換為對應(yīng)的十進(jìn)制數(shù)的ASCII碼串。
       
答:    ;從 F000:0000H開始1024個Word有符號數(shù)統(tǒng)計
        ;output Di=0的個數(shù)
        ;       Bx=正數(shù)的個數(shù)
        ;       DX=負(fù)數(shù)的個數(shù)
        TEST7 proc
        push cx
        push ax
        push si
        mov ax,0f000h
        mov es,ax
        xor bx,bx
        xor si,si
        xor ax,ax
        xor di,di
        xor dx,dx
        mov cx,1024
       
 Next1:
        mov ax,es:[si]         
        cmp ax,0
        jnz check_P
        inc di
        jmp next2
check_p:
        shl ax,1
        jnc ADD_P
        inc dx
        jmp next2
ADD_P:
        inc bx
next2:
        inc si
        inc si  
        loop Next1
       
        pop si
        pop ax
        pop cx
        ret
        TEST7 endp
       
        分別call convert1, 并保存到不同的地方即可;
       
題3.38  設(shè)從地址F000:0000H開始的內(nèi)存區(qū)域是緩沖區(qū),存放了一組單字節(jié)的正數(shù)或負(fù)數(shù),
        以0結(jié)尾。請編寫一個程序確定其中最大的正數(shù)和最小的負(fù)數(shù)。
       
答:    ;從 F000:0000H開始以0結(jié)尾的單字節(jié)正數(shù)負(fù)數(shù)統(tǒng)計
        ;output bh=最大的正數(shù)
        ;       bl=最小的負(fù)數(shù)   
     TEST8 proc
     xor bx,bx
     xor si,si
     mov ax,0F000h
     mov es,ax
next9:    
     mov al,es:[si]
     cmp al,0
     jz exit9
     test al,80h
     jnz Neg_1
     cmp al,bh
     jb next7
     xchg al,bh
next7:
     inc si
     jmp next9    
    
Neg_1:
     cmp al,bl
     jg next8    
     xchg al,bl
next8:
     inc si
     jmp next9    
exit9:    
     ret
     TEST8 endp                         

題3.39  設(shè)從地址F000:0000H開始的1K字節(jié)內(nèi)存區(qū)域是緩沖區(qū)。請寫一個可收集該區(qū)域內(nèi)
        所有子串“OK”開始地址的程序

答:    ;從 F000:0000H開始1K字節(jié)內(nèi)存區(qū)域,統(tǒng)計子串“OK”開始地址
        ;output  開始地址=ADDRESS 
     TEST9 proc
     xor bx,bx
     xor si,si
     mov ax,0F000h
     mov es,ax
     mov cx,1024
next5:
     mov ax,es:[si]
     cmp ax,'OK'
     jnz next6
     mov ADDRESS[BX],si
     inc bx
     inc bx
    
next6:
     inc si
     inc si
     loop next5      
     ret
     TEST8 endp 

題3.40  請優(yōu)化3.6.2節(jié)例7所示排序程序。

答: 自己優(yōu)化下;   


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多