汇编输出12ABH三种方法

用mov ah,02h 输出12ABH 我会三种方式,想看看有没有大佬有更容易的方法
第一种:
data segment
     BUF dw 12ABH        ;定义数据
data ends
code segment
     assume cs:code,ds:data
start:
     mov ax,data
     mov ds,ax
     mov ax,BUF        ;传入显示的值        
     mov bx,ax        ;把ax的值赋值给bx
     mov bh,bl          
     mov cl,4
     shr bh,cl
     shl bl,cl
     or bl,bh               ;低八位中低四位和高四位互换
     mov al,ah
     mov cl,4
     shr al,cl
     shl ah,cl
     or ah,al        ;高八位低四位和高四位互换
     mov bh,ah          ;把互换结果传给bx的高八位
     xchg bl,bh          ;交换低八位和高八位
     xor cx,cx        ;cx置0
     mov cl,4        ;循环次数
main:
     mov dh,bl        ;将al的内容传个dh
     shr bx,1
     shr bx,1
     shr bx,1
     shr bx,1        ;把ax逻辑右移4位
     and dh,0fh        ;dh高4位置0
     add dh,30h        ;先认为都是数字,全部都+30h
     cmp dh,':'        ;因为':'的ASCII码比91 而字母与数字的ASCII码中间隔了7个字符,所以判断这个
     ja isLetter        ;字母跳转
     jb print        ;不是字母
isLetter:
     add dh,7h        ;ASCII码+7变为字母
print:
     mov dl,dh        ; 把dh的值传给dl
     mov dh,0        ;清空dh的值  
     mov ah,2        ;输出
     int 21h        ;执行功能
     loop main        ;继续下一次
     mov ah,4ch        ;退出程序
     int 21h        ;执行功能
code ends
    end start


第二种:
data segment
     BUF dw 12ABH        ;定义数据
data ends
code segment
     assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    mov bx,BUF                ;传入显示的值        
    xor cx,cx                ;cx置0
    mov cl,4                ;入栈循环次数
main:
    mov dh,bl                ;将ax的低八位传个dh
    shr bx,1
    shr bx,1
    shr bx,1
    shr bx,1                ;把ax逻辑右移4位
    and dh,0fh                ;dh高4位置0
    add dh,30h                ;先认为都是数字,
    cmp dh,':'                ;':'ASCII的值比数字大,比字母小
    ja isLetter                ;字母
    jb isNumber                ;数字
isLetter:
    add dh,7h                ;ASCII码+7变为字母
isNumber:
        push dx                        ;数据入栈
        loop main                ;数据循环入栈,直到cl=0
        mov cl,4                ;出栈循环次数
print:                
        pop dx                        ;数据出栈
    xchg dl,dh                ;交换dl和dh的值
    mov ah,2                ;输出
    int 21h                        ;执行功能
        loop print                ;数据循环输出,直到cl=0
exit:                                ;退出程序
    mov ah,4ch                
    int 21h                        
code ends
    end start



第三种:
data segment
    Temp db '0000','$'
     BUF dw 12abh
data ends
code segment
      assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    ;正式代码开始
    mov ax,BUF        ;设置需要显示的AX的值
    mov si,offset Temp+3;保存存储结果的字符串的最后一个字符偏移地址
    xor cx,cx           ;对cX清零
    mov cl,4            ;设置循环次数为4次
MainPart:
    mov dh,al           ;将Al的内容传送给DH
    shr ax,1
    shr ax,1
    shr ax,1
    shr ax,1
                ;上述4句为使AX逻辑右移4位 理论上可以写成 shr AX ,cl(cl设置为4) 
                ;但这个地方cl要记录循环次数每次循环会是cl-1所以无法满足正常的移位需要
    and dh,0fh
    add dh,30h
    cmp dh,':'  ;':'的ASCII比91 而字母的ASCII码与数字的ASCII码中间隔了7个其它字符
    ja isLetter ;如果为字母则跳转
    jb No       ;如果不是

isLetter:
    add dh,7h  ;ASCII码加7变为字母
No:
    mov [si],dh ;将字符存入,待存放内容的字符串的对应位置
    dec si      ;待存放内容的内存地址自减1
    loop MainPart
print:   
    mov dx,offset Temp  ;将带打印的字符串的偏移地址存放进dx中
    mov ah,09      
    int 21h       
    mov al,0
    mov ah,4ch
    int 21h
code ends
    end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值