摘要:基于小模式,調(diào)用C語言的Scanf()和Printf()函數(shù)實(shí)現(xiàn)了在匯編語言中不同進(jìn)制的輸入和輸出,文章對在匯編程序中調(diào)用C函數(shù)的關(guān)鍵問題進(jìn)行了分析并據(jù)此給出了在匯編語言中實(shí)現(xiàn)多種進(jìn)制的通用輸入輸出源程序。
關(guān)鍵詞:匯編語言;小模式;調(diào)用C函數(shù);多種進(jìn)制;通用輸入輸出;源程序;實(shí)現(xiàn)
中圖分類號:TP312文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)36-3068-03
Realization of Varied Hexadecimal Universal Input-output with the Assembly Language
LUO Nan-chao1, XIANG Chang-cheng1,2, LI Tang-hui1,3
(1. Aba Teachers College Department of Computer Science, Pixian 623000, China;2. University of Electronic Science and Technology Institute of Applied Mathematics, Chengdu 610054, China;3. Sichuan University School of Computer, Chengdu 610054, China)
Abstract: Based on the small model, called the C language Scanf() and Printf() function to achieve in the compilation of language in different band of input and output, the article in the compilation process in the call C functions of the key issues were analyzed and, accordingly Language is given in the compilation of the band to achieve a variety of input and output common source.
Key words: assembly language;the small model;called C function;varied Hexadecimal;universal input-output;source program;realization
1 引言
在匯編語言中要實(shí)現(xiàn)不同進(jìn)制的輸入輸出一直比較麻煩,雖然有很多文章就這方面的問題做了深入細(xì)致地探討[1-2]。但所有的方法都較為繁瑣,程序長度較大,并且使用戶在編寫程序時往往為尋找入口參數(shù)感到力不從心,因此必須尋求一種簡單易行的方法,聯(lián)想到在C語言中要實(shí)現(xiàn)各種進(jìn)制的輸入輸出非常簡單,何不利用在匯編語言中調(diào)用C語言的輸入輸出函數(shù)實(shí)現(xiàn)各種的進(jìn)制的輸入輸出呢?下面就基于小模式下匯編語言如何調(diào)用C語言的Scanf()和Printf()函數(shù)實(shí)現(xiàn)多種進(jìn)制的通用輸入輸出進(jìn)行分析并給出具體源程序。
2 匯編語言程序調(diào)用C函數(shù)的關(guān)鍵
結(jié)合匯編語言與C語言連接的關(guān)鍵問題[3]和C語言與匯編語言混合編程的約定規(guī)則[4],總結(jié)得出匯編語言程序調(diào)用C函數(shù)的關(guān)鍵性問題:
2.1 匯編程序與C程序的模塊要正確連接
必須做到兩點(diǎn):一是匯編模塊必須采用和C模塊一致的存儲模式;二是匯編模塊必須遵守和C兼容的命名約定,包括函數(shù)和變量命名約定。
針對第一點(diǎn),這里采用小模式(.model small)實(shí)現(xiàn),在小模式下所有的指針都是Near型近指針,程序運(yùn)行效率高。
針對第二點(diǎn),主要完成對匯編語言程序所調(diào)用的C語言函數(shù)、變量用關(guān)鍵字EXTERN進(jìn)行說明,形式如下:
EXTERN被調(diào)用函數(shù)名:函數(shù)屬性
EXTERN變量名:變量屬性
其中函數(shù)屬性為near;變量屬性可以為byte、word、dword等。
例如在C語言程序中有如下說明:int i, array[10]; charch; long result;
匯編語言程序中,應(yīng)說明為:EXTERN i:word,arrray:word,ch:byte,result:dword
此外,為了使C語言的標(biāo)識符能在匯編語言中可見,必須用PUBLIC操作符定義它。
2.2 參數(shù)的正確傳遞是關(guān)鍵
匯編語言程序通過堆棧向C語言函數(shù)傳遞參數(shù),在匯編語言中將BP作為基址寄存器,調(diào)用程序先將來自于C程序中的參數(shù)壓人堆棧中(參數(shù)壓入堆棧的順序與實(shí)參表中參數(shù)的順序相反),然后當(dāng)需要使用這些參數(shù)時,再用BP加上不同的偏移量依次對堆棧中的數(shù)據(jù)進(jìn)行存取操作。在匯編語言程序調(diào)用C函數(shù)完成后,立即平衡堆棧。即清除堆棧里的參數(shù),恢復(fù)堆棧到調(diào)用前的情形。這里可以利用“add sp,imm”指令來完成,使SP的值增加一個指定的值。imm這個值應(yīng)該是堆棧中返回地址所占字節(jié)數(shù)與傳送參數(shù)所占用字節(jié)數(shù)之和。
為便于討論,下面以輸入輸出一個字為例,給出具體的輸入輸出源程序。
3 具體編程實(shí)現(xiàn)
3.1 十進(jìn)制、八進(jìn)制、十六進(jìn)制的通用輸入輸出源程序
.model small
.data
f21db 'Please input a data to A:',0;顯示輸入數(shù)據(jù)提示信息
f22db '%d',0 ;若是八進(jìn)制則改為%o,十六進(jìn)制則改為%x
f23db 'output data is:',0;顯示輸出二進(jìn)制數(shù)據(jù)提示信息
f24db '%d',0;若是八進(jìn)制則改為%o,十六進(jìn)制則改為%x
A dw 0;輸入的數(shù)據(jù)放入A存儲單元
.code
EXTRN _printf:NEAR
EXTRN _scanf:NEAR
PUBLIC _main
_main proc near
start:
mov ax,@data
mov ds,ax
mov ax,offset f21
push ax
call near ptr _printf
pop cx
lea ax,A
push ax
mov ax,offset f22
push ax
call near ptr _scanf ;輸入一個字長度的十進(jìn)制數(shù)
add sp,4
mov ax,offset f23
push ax
call near ptr _printf
pop cx
push A
lea ax,f24
push ax
call near ptr _printf ;輸出十進(jìn)制數(shù)
add sp,4
ret
_main endp
end start
3.2 二進(jìn)制的通用輸入輸出源程序
由于C語言中沒有提供直接輸入輸出二進(jìn)制的方法,這兒利用DOS中斷調(diào)用1號、2號功能分別實(shí)現(xiàn)二進(jìn)制的輸入輸出,具體源程序如下:
.model small
.data
f21 db 'Please input a data to A:',0; 顯示輸入二進(jìn)制數(shù)據(jù)提示信息
f23 db 'output Binary data is:',0 ; 顯示輸出二進(jìn)制數(shù)據(jù)提示信息
A DB 15 DUP(0);定義一個字長度的存儲單元用于存儲輸入的二進(jìn)制數(shù)
.code
EXTRN _printf:NEAR
PUBLIC _main
_main proc near
start:
mov ax,@data
mov ds,ax
mov ax,offset f21
push ax
call near ptr _printf
pop cx
xor si,si
next:mov ah,1 ;輸入16位二進(jìn)制數(shù)
int 21h
mov a[si],al
inc si
cmp si,15
jle next
mov dl,13;回車
mov ah,2
int 21h
mov dl,10;換行
mov ah,2
int 21h
mov ax,offset f23; 輸出16位二進(jìn)制數(shù)
push ax
call near ptr _printf
pop cx
xor si,si
next1:mov dl,A[si]
mov ah,2
int 21h
inc si
cmp si,15
jle next1
mov ah,1;屏幕回顯結(jié)果
int 21h
ret
_main endp
end start
4 程序驗(yàn)證
根據(jù)各種進(jìn)制的表示范圍,在輸入時進(jìn)行規(guī)范輸入,具體輸入輸出結(jié)果驗(yàn)證如下:
1) d方式輸入輸出:假設(shè)分別輸入為65535、0、32767、32768,則輸出結(jié)果為-1、0、32767、-32768(規(guī)范輸入范圍為0~65535)
2) o方式輸入輸出:假設(shè)輸入為0、7777、17777,則輸出結(jié)果為0、7777、17777(規(guī)范輸入范圍為0~177777)
3) x方式輸入輸出:假設(shè)輸入為0、1234、ffff,則輸出結(jié)果為0、1234、ffff(規(guī)范輸入范圍為0~ffff)
4) 二進(jìn)制方式的輸入輸出:假設(shè)輸入為0000000000000000、1010100000001011、1111111111111111,則輸出結(jié)果為0000000000000000、1010100000001011、1111111111111111(規(guī)范輸入范圍為0~1111,1111,1111,1111)
5 結(jié)束語
C語言與匯編語言的混合編程同時具有了兩種語言的優(yōu)點(diǎn),彼此相互調(diào)用,進(jìn)行參數(shù)傳遞,充分發(fā)揮各自的優(yōu)勢和特點(diǎn),利用現(xiàn)有的多種實(shí)用程序、庫程序等使軟件的開發(fā)效率大大提高,開發(fā)周期大大縮短,在工業(yè)控制和科學(xué)計算中具有很強(qiáng)的實(shí)用性。源程序模塊只對輸入輸出一個字的A數(shù)據(jù)進(jìn)行了探討,如果改變A的位數(shù),同時對程序作簡單改變,就可實(shí)現(xiàn)任意位數(shù)的各種進(jìn)制的輸入輸出。
參考文獻(xiàn):
[1] 楊繼鵬.用匯編語言實(shí)現(xiàn)多種數(shù)制的通用輸入方法[J].電腦學(xué)習(xí),2008(1):59-60.
[2] 林天山.多種數(shù)制顯示的匯編語言實(shí)現(xiàn)[J].新疆石油教育學(xué)院學(xué)報,2006(3):63-64.
[3] 王文東,李竹林,尚建人.匯編語言與C語言的混合程序設(shè)計技術(shù)[J].計算機(jī)技術(shù)與發(fā)展, 2006,8(16):18-20.
[4] 張永,黃建宇,劉治生.C語言與匯編語言混合編程的研究與實(shí)現(xiàn)[J]. 計算機(jī)與數(shù)字工程, 2006(5):120-122.
[5] 胡又農(nóng).IBM-PC匯編語言程序設(shè)計試題解[M].北京:人民郵電出版社,2004.
[6] 沈美明,溫冬嬋.IBM-PC匯編語言程序設(shè)計[M]. 北京:清華大學(xué)出版社,2001.
注:“本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。”