首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

組合語言實作:讀取暫存器內容並寫入檔案

     編輯:組合語言

本程式演示在 DOS 環境下(MASM 5.0 / Windows XP),將 AX、BX、CX、DX 四個通用暫存器的 16 位元組值轉換為 ASCII 十六進位字串,寫入同目錄下的 TEMP.TXT,並顯示成功訊息等待按鍵退出。

程式功能流程

  1. 設定測試值:AX=ABCDh, BX=4645h, CX=4F5Bh, DX=FFFFh
  2. 呼叫 SaveRegToMem 暫存暫存器值到記憶體變數
  3. 呼叫 MovAll 將四值轉 ASCII 字串(各 4 字元 + CR/LF)
  4. 呼叫 SaveToFile 建立/寫入 TEMP.TXT
  5. 顯示提示,等待按鍵退出

核心子程式解析

1. 十六進位轉 ASCII:ConvertToAsc

ConvertToAsc 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。

2. 字串複製巨集:MovToVar

MovToVar 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

3. 檔案操作: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 字元十六進位 + 換行,符合預期。

教學重點

  • 暫存器值保存與轉換分離,結構清晰
  • 巨集簡化重複轉換邏輯
  • DOS INT 21h 檔案操作標準流程(建立→寫入→驗證→關閉)
  • 錯誤碼 CF 檢查與使用者友善提示
  • 十六進位轉 ASCII 經典演算法(ROL + 查表/判斷)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved