本程式演示在 DOS 環境下(MASM 5.0 / Windows XP),將 AX、BX、CX、DX 四個通用暫存器的 16 位元組值轉換為 ASCII 十六進位字串,寫入同目錄下的 TEMP.TXT,並顯示成功訊息等待按鍵退出。
AX=ABCDh, BX=4645h, CX=4F5Bh, DX=FFFFhSaveRegToMem 暫存暫存器值到記憶體變數MovAll 將四值轉 ASCII 字串(各 4 字元 + CR/LF)SaveToFile 建立/寫入 TEMP.TXTConvertToAscConvertToAsc proc near
; 入口:BX = 16-bit 值
; 出口:CAscii[0..3] = 4 字元 ASCII, CAscii[4] = '$'
push ax, cx, dx
mov bp, 0
mov ch, 4 ; 4 個十六進位數位
xh:
mov cl, 4
rol bx, cl ; 循環左移 4 位,高 4 位移到 BL 低 4 位
mov al, bl
and al, 0fh ; 取低 4 位
add al, 30h ; '0'..'9'
cmp al, 3ah ; > '9'?
jl toCascii
add al, 7h ; 'A'..'F'
toCascii:
mov CAscii[bp], al
inc bp
dec ch
jnz xh
mov CAscii[bp], '$'
pop dx, cx, ax
ret
ConvertToAsc endp
使用 ROL BX, 4 依序取出高位至低位 nibble,DAA 指令未用,改用手動判斷加 7 法轉 A-F。
MovToVarMovToVar Macro m_Reg, Asc_AX
mov bx, m_Reg
call ConvertToAsc
lea si, CAscii
lea di, Asc_AX
mov cx, 4
rep movsb ; 複製 4 字元
EndM
SaveToFile (INT 21h)AH=3Ch 建立檔案 (CX=0 正常屬性)AH=40h 寫入檔案 (BX=handle, CX=bytes, DS:DX=buffer)AH=3Eh 關閉檔案JC 跳轉顯示錯誤訊息MovToVar Macro m_Reg,Asc_AX
mov bx,m_Reg
call ConvertToAsc
lea si,CAscii
lea di,Asc_AX
mov cx,4d
rep movsb
EndM
data segment
mAX dw 0; mBX dw 0; mCX dw 0; mDX dw 0
AscAX db 4 dup(?),0dh,0ah
AscBX db 4 dup(?),0dh,0ah
AscCX db 4 dup(?),0dh,0ah
AscDX db 4 dup(?),0dh,0ah
WriteBytes EQU $-AscAX
CAscii db 5 dup(?)
filename db 'temp.txt$',0h
filehandle dw ?
ferr_num1 db 'Error occurred when create file!$'
ferr_num2 db 'Write file error!$'
tssaveok db 'Write register value to file success.$'
tsexit db 'Press any key to exit...$'
data ends
code segment
assume cs:code,ds:data,es:data
main proc far
start:
push ds; sub ax,ax; mov ax,data; mov ds,ax; mov es,ax; sub ax,ax
mov ax,0ABCDh; mov bx,4645h; mov cx,4F5Bh; mov dx,0FFFFh
call SaveRegToMem; call MovAll; call SaveToFile; call NextLine
lea dx,tsexit; call ShowString
waittoexit:
mov ah,0h; int 16h
exitprogram:
mov ah,4ch; int 21h
main endp
MovAll proc near
push ax,bx,cx,dx
MovToVar mAX,AscAX; MovToVar mBX,AscBX; MovToVar mCX,AscCX; MovToVar mDX,AscDX
pop dx,cx,bx,ax; ret
MovAll endp
SaveRegToMem proc near
mov mAX,ax; mov mBX,bx; mov mCX,cx; mov mDX,dx; ret
SaveRegToMem endp
ShowString proc near
push ax; mov ah,09h; int 21h; pop ax; ret
ShowString endp
NextLine proc near
mov ah,02h; mov dl,0dh; int 21h
mov ah,02h; mov dl,0ah; int 21h; ret
NextLine endp
ConvertToAsc proc near
push ax,cx,dx; mov bp,0h; mov ch,4h
xh: mov cl,4h; rol bx,cl; mov al,bl; and al,0fh; add al,30h
cmp al,3ah; jl toCascii; add al,7h
toCascii: mov CAscii[bp],al; inc bp; dec ch; jnz xh
mov CAscii[bp],'$'; pop dx,cx,ax; ret
ConvertToAsc endp
SaveToFile proc near
mov ah,3ch; mov cx,0h; lea dx,filename; int 21h; jc ferr1
mov filehandle,ax
mov ah,40h; mov bx,filehandle; mov cx,WriteBytes; lea dx,AscAX; int 21h
jc ferr1; cmp ax,WriteBytes; jne ferr2
mov bx,filehandle; mov ah,3eh; int 21h
lea dx,tssaveok; call showstring; call nextline; ret
ferr1: lea dx,ferr_num1; call showstring; call nextline; ret
ferr2: lea dx,ferr_num2; call showstring; call nextline; ret
SaveToFile endp
code ends
end start
TEMP.TXT 內容:
ABCD
4645
4F5B
FFFF
每行 4 字元十六進位 + 換行,符合預期。
CF 檢查與使用者友善提示