匯編學習小記(四)-分支程序設計

1.一個字節(jié)表示一個十進制數(shù)(非壓縮BCD碼)

15存儲的形式為0000 0001 0000 0101

  • 加上3030h
  • 3135h高低字節(jié)輸出就是15

0000 1111

  • 除--商--1
  • ?30h輸出
  • 除--取余--5
  • ?30h輸出

2.轉(zhuǎn)移指令和位操作指令

  • 無條件轉(zhuǎn)移指令。Jmp理解掌握段內(nèi)尋址和段間尋址方式
  • 條件轉(zhuǎn)移指令,無符號數(shù)比較轉(zhuǎn)移,帶符號數(shù)比較轉(zhuǎn)移,cx為0轉(zhuǎn)移指令(jcxz)
    • 【注意??】這些都為短轉(zhuǎn)移指令,當代碼過長超出-128-127的的轉(zhuǎn)移范圍,學會使用無條件指令作為中間橋梁完成相應的功能

16進制:0~65535

  • 65535

  • 內(nèi)存中存儲方式1111 1111 1111 1111

  • 16進制數(shù) ffff

  • 1234h

    • 0001 0010 0011 0100
    • 循環(huán)右移(先低位)0100 0001 0010 0011
      • 左 0010 0011 0100 0001
    • 與 0000 0000 0000 1111
    • 0 0 0 1
  • rol 大于4位的就進行轉(zhuǎn)移

  • LST文件中查看

  • euq定義的是一個常量

    • db、dw開辟的都是在內(nèi)存中占用空間,但是equ在內(nèi)存中并不占用空間
    • count que(&-t)表中的字所占用的字節(jié)個數(shù)
      注意這是字節(jié)的個數(shù)(找字/2)
  • 注意 一個字占兩個字節(jié) add si,2

  • &--當前位置

  • '&'--字符

1.十進制數(shù)轉(zhuǎn)換為十六進制數(shù)輸出

image
image
image
data segment
         t dw 1234h,65535,345,234,6765,111,3,2,4565,1,2346,898,10
         count equ($-t)/2 ;計算t的長度,共有幾個部分
         table db '0123456789ABCDEF' ;用于二進制計算后對應過來找16進制數(shù)
         temp dw ? ;用于儲存
         info db 0dh,0ah,'HEX = $';HEX的意思是16進制數(shù)
data ends
code segment
assume cs:code,ds:data
            start:

            mov ax,data
            mov ds,ax

            mov bp,count       ;儲存大循環(huán)的次數(shù)-bp

            mov si,0 ;用于將t[0]第一個給bx

            out1:
            mov dx,offset info ;將提示信息輸出
            mov ah,9
            int 21h

            mov bx,t[si] ;將t[0]第一個給bx
            mov ch,4 ;  循環(huán)次數(shù):16進制,需要循環(huán)4次

            in1:
            mov cl,4  ;大于兩位都需要 借助 寄存器 進行轉(zhuǎn)移
            rol bx,cl ;  移動,將最左邊的4個移到最右邊

            mov [temp],bx ;將 移動后的bx 放到 temp 中

            and bx,0fh ;進行AND操作,除了末后四位,剩下的清零屏蔽,畢竟16 進制
            mov dl,table[bx] ;在table表中找到對應的16進制數(shù)

            mov ah,2
            int 21h ;輸出一個字符

            mov bx,[temp] ; 每次移動后的temp

            dec ch   ; ch每次都自減,用于循環(huán)判斷
            jnz in1  ; ch 為0 說明,輸出夠4位了->結(jié)束,否則繼續(xù)進行右移轉(zhuǎn)換

            add si,2 ;進入下一個 字 的十六進制轉(zhuǎn)換
            dec bp   ;循環(huán)次數(shù)自減
            jnz out1 ;再次進入大循環(huán)

            mov ah,4ch
            int 21h
code ends
end start

2.十進制數(shù)轉(zhuǎn)換為二進制數(shù)輸出

image
image
data segment
         t dw 1234h,65535,345,234,6765,111,3,2,4565,1,2346,898,10
         count equ($-t)/2 ;計算t的長度,共有幾個部分
         table db '01' ;用于二進制顯示
         temp dw ? ;用于儲存
         info db 0dh,0ah,'BIN = $'
data ends
code segment
assume cs:code,ds:data
            start:
            mov ax,data
            mov ds,ax

            mov bp,count       ;儲存大循環(huán)的次數(shù)-bp

            mov si,0 ;用于將t[0]第一個給bx

            out1:

            mov dx,offset info
            mov ah,9
            int 21h

            mov bx,t[si]

            mov ch,16 ;  循環(huán)次數(shù):2進制,需要循環(huán)16次

            in1:

            rol bx,1 ;  移動,將最左邊的4個移到最右邊

            mov [temp],bx ;將已經(jīng)移動了的bx放到temp中

            and bx,01h ;進行AND操作,除了末后四位,剩下的清零屏蔽,畢竟16 進制
            mov dl,table[bx] ;在table表中找到對應的2進制數(shù)

            mov ah,2
            int 21h ;輸出一個字符

            mov bx,[temp] ; 每次移動后的temp

            dec ch   ; ch每次都自減,用于循環(huán)判斷
            jnz in1  ; ch 為0 說明,輸出夠4位了,結(jié)束

            add si,2
            dec bp
            jnz out1

            mov ah,4ch
            int 21h
code ends
end start

3.課本99頁,計算Y=5X-Y,求絕對值,并顯示十進制結(jié)果

image
data segment
        X db -6  ; x 定義為字
        Y dw ?   ; y定義為字節(jié)
        cc db 0ah,0dh,'Y= $ '
data ends
code segment
assume cs:code,ds:data
            start:
            mov ax,data
            mov ds,ax ;將數(shù)據(jù)段段地址賦值給ds

            mov al,5
            imul X ;ax=5X
            sub ax,18 ;ax=5X-18

            jns let0 ;結(jié)果不為負 則轉(zhuǎn)移

            neg ax ;結(jié)果為負 則求其絕對值-- 求補運算

        let0:
            mov Y,ax  ;保存結(jié)果

            ;將ax中的二進制數(shù)變?yōu)槭M制數(shù),并顯示
            mov cx,0
            mov bx,10

        let1:
            mov dx,0
            inc cx ;統(tǒng)計余數(shù)個數(shù)
            idiv bx ;ax/10 商在ax,余數(shù)在dx
            push dx ;保存余數(shù)
            cmp ax,0 ;商為0 則退出循環(huán)         
            jnz let1 ;結(jié)果不為0,則繼續(xù)進入let1中進行循環(huán),與cmp指令連用

            mov dx,offset cc
            mov ah,9
            int 21h ;利用9號功能將cc提示進行顯示

        let2:   ;循環(huán)執(zhí)行cx次,顯示十進制結(jié)果
            pop ax ;將余數(shù)彈入ax中
            add ax,0030h ;調(diào)整為ascii

            mov dl,al ;調(diào)用2號功能顯示一個字符,一個一個進行輸出
            mov ah,2
            int 21h
            dec cx ;像是一個則進行自減
            cmp cx,0
            jnz let2

            mov ah,4ch
            int 21h
code ends
end start

4.使用菜單顯示(普通跳轉(zhuǎn))

image

鍵盤控制輸出類型

image
image
image
data segment
         t dw 1234h,65535,345,234,6765,111,3,2,4565,1,2346,898,10
         count equ($-t)/2 ;計算t的長度,共有幾個部分

         HEXMap db '0123456789ABCDEF' ;用于對應過來找16進制數(shù)
         HEXSave dw ? ;用于儲存二進制
         HEXMessage db 0dh,0ah,'BIN = $'

         BINMap db '01' ;用于對應過來找2進制數(shù)
         BINSave dw ?  ;用于儲存
         BINMessage db 0dh,0ah,'HEX = $';HEX的意思是16進制數(shù)
 
         info db 0dh,0ah,'Welcome to here : 1-HEX ,2-BIN  => your choice: $'

data ends
code segment
assume cs:code,ds:data
            start:

            mov ax,data
            mov ds,ax

            mov bp,count       ;儲存大循環(huán)的次數(shù)-bp

            mov si,0 ;用于將t[0]第一個給bx

    main:
        mov dx,offset info ;提示信息
        mov ah,9
        int 21h

        mov ah,1 ;輸入choice
        int 21h 

        sub al,30h ;鍵盤輸入1,電腦存儲的是31h,所以需要減去30h

        cmp al,1
        jz HEX ;1 - 十六進制

        cmp al,2
        jz BIN ;2 - 二進制

    HEX:
mov bp,count
mov si,0
        HEXBig:
            mov dx,offset HEXMessage
            mov ah,9
            int 21h

            mov bx,t[si]
            mov ch,4 
        
        HEXSmall:
            mov cl,4
            rol bx,cl

            mov [HEXSave],bx

            and bx,0fh
            mov dl,HEXMap[bx]
            mov ah,2 ;輸出一個字符
            int 21h 

            mov bx,[HEXSave] 

            dec ch
            jnz HEXSmall ;結(jié)果不為0,則轉(zhuǎn)移

            add si,2
            dec bp
            jnz HEXBig ;結(jié)果不為0,繼續(xù)進入大循環(huán)
            
            jmp main 

    BIN:
mov bp,count
mov si,0
        BINBig:
            mov dx,offset BINMessage
            mov ah,9
            int 21h

            mov bx,t[si]
            mov ch,16

        BINSmall:
            rol bx,1
            mov [BINSave],bx

            and bx,01h
            mov dl,BINMap[bx]
            mov ah,2
            int 21h

            mov bx,[BINSave]

            dec ch
            jnz BINSmall

            add si,2
            dec bp
            jnz BINBig ;結(jié)果不為0,繼續(xù)進入大循環(huán)

            jmp main


code ends
end start

image
image
image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容