Ⅰ 編寫匯編程序
例6.2設內存中有三個互不相等的無符號字數據,分別存放在ARG開始的字單元,編製程序將其中最大值存入MAX單元.
A,B,C
大
大
6.3分支結構程序設計-例6.2
1:;*****EXAM6.2*****
2:SSEG SEGMENT STACK
3:STK DB 20 DUP(0)
4:SSEG ENDS
5:DSEG SEGMENT
6:ARG DW 7138H,84A6H,29EH
7:MAXDW
8:DSEG ENDS
9:CSEG SEGMENT
10: ASSUME CS:CSEG,DS:DSEG
11: ASSUME SS:SSEG
12:FMAX:MOV AX,DSEG
13: MOV DS,AX
14: MOV AX,SSEG
15: MOV SS,AX
16: MOV SP,SIZESTK
17: LEA SI,ARG ;取數據首址
18: MOV AX,[SI] ;取第1個數
19: MOV BX,[SI+2] ;取第2個數
20: CMP AX,BX ;兩數比較
21: JAE FMAX1 ;AX中的數大
22: MOV AX,BX ;大數送AX
23:FMAX1:CMP AX,[SI+4] ;大數與第3個數比較
24: JAE FMAX2 ;AX中的數大
25: MOV AX,[SI+4] ;第3個數大大值
26:FMAX2:MOV MAX,AX ;保存最大值
27: MOV AH,4CH
28: INT 21H
29:CSEG ENDS
30: ENDF MAX
二,實驗內容:
編程實現對一個首地址為A的N字數組芹念歷排序.
三,實驗要求:
同實驗一高孝
四,實驗提示
可採用多種排序演算法實現該操作.採用冒泡嫌搜排序方法參考程序如下:
DATA SEGMENT
A DW N DUP( )
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1:MOV DI,CX
MOV BX,0
LOOP2:MOV AX,A[BX]
CMP AX,A[BX+2]
JGE CONT
XCHG AX,A[BX+2]
MOV A[BX],AX
CONT:ADD BX,2
LOOP LOOP2
MOV CX,DI
LOOP LOOP1
RET
MAIN ENDP
CODE ENDS
END START
注意:該參考程序缺少初始數據輸入和排序結果輸出,同學們在做實驗時應將這兩個步驟考慮進去
Ⅱ 如何編寫完整的匯編程序
看很多資料的話就應該懂得寫啊,先看那個王爽的書咯,到第四章差不多就會寫了。努力啊
Ⅲ 用匯編語言編寫一個程序
感樓主誠意,費了九牛二虎之力,方才完成。不知能否滿足要求。蠢斗
; 本程序通過編譯,運行正確
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
Name_Len equ 18 ;用戶名最大長度
Pass_Len equ 8 ;密碼最大長度
; -------------------------------------
; 將用戶名和密碼定義為一個結構類型
User Struc ; 成績單結構類型
User_Name db Name_Len p(?) ; 用戶名
Name_Lenth db ? ;用戶名實際長度
Pass_word db Name_Len p(?) ; 密碼
Pass_Lenth db ? ;密碼實際長度
User EndS
; -------------------------------------
; 功能:顯示指定地址(Str_Addr)的字元串
; 入口:
; Str_Addr=字元串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:取游標位置
; 入口:無
; 出口:DH=行號,DL=列號
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置游標位置
; 入口:Cursor_Row=行坐標; Cursor_Col: 列坐標)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 窗口上滾指定行數
Roll_Up Proc Near
xor bh,bh ;顯示頁號
mov ah,8 ;讀游標位置的字元和屬性
int 10h
mov bh,ah ;上滾窗口空行屬性
mov cx,100h ;左上角坐標
mov al,5
mov dx,54fh ;右下角坐標
mov ah,6
int 10h
ret
Roll_Up EndP
; -----------------帆局--------------------
; 功能:輸入指帶轎磨定位數的用戶密碼,實際輸入的密碼字元以「*」顯示,並有回空糾錯功能
; 入口:di=密碼輸入緩沖區地址
; 出口:AL=實際輸入的密碼字元數
Input_PassW Proc Near
push di
mov cx,Pass_Len ;密碼最大長度
@@Input: call GetCursor ;取游標位置
mov ah,7 ;從鍵盤接受一個字元
int 21h
cmp al,CR ;回車符?
jz @@Calc_Chrs ;是,結束密碼輸入,轉去計算實際輸入的密碼字元數
cmp al,KBBack
jz @@KB_Back ;若是回空鍵,重新輸入
stosb ;保存輸入的字元
mov dl,'*'
mov ah,2
int 21h
jmp @@KBBack
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: inc Cursor_Col
call SetCursor ;置游標位置
loop @@Input ;接受下一個數字
@@Calc_Chrs:mov cx,di
pop di
sub cx,di
cmp cl,[si.Pass_Lenth]
jnz @@Pass_Err ;密碼長度不等
mov cl,[si.Pass_Lenth]
xor ch,ch
push si
lea si,[si.Pass_Word]
cld
repz cmpsb ;比較密碼是否正確
pop si
jcxz $+4
@@Pass_Err: clc ;進位標志復位,表示密碼不正確
ret
stc ;進位標志置位,表示密碼正確
ret
Input_PassW EndP
; -------------------------------------
Again_Input Proc Near
Output Input_Again ;提示:是否重新輸入用戶名
mov ah,1 ;從鍵盤接受一個字元
int 21h
or al,20h ;轉換成小寫,大小寫不敏感
cmp al,'y' ;重新輸入?
jnz $+7 ;不
call Roll_Up ;窗口上滾指定行數
stc ;進位標志置位,表示重復前面的操作
ret
cmp al,'n' ;不重新輸入?
jnz Again_Input ;不是,非有效字母,重新輸入
clc ;進位標志復位,表示放棄前面的操作
ret
Again_Input EndP
; -------------------------------------
Users equ 5 ;用戶數
Even
User_Inform User <'richcon',7,'12345678',8>
User <'WangMing',8,'21345678',8>
User <'ZhangHongQiao',13,'13245678',8>
User <'LiYan',5,'12435678',8>
User <'XuPengYu',12,'12354678',8>
Prompt_User db 'User name: $'
Prompt_Word db 'Pass word: $'
Empty_Error db 7,CR,LF,CR,LF,'User name is empty.$'
Register_No db 7,CR,LF,CR,LF,'No register.$'
Pass_Error db 7,CR,LF,CR,LF,'Pass word error!$'
Welcome db 7,CR,LF,CR,LF,'WELCOME$',0
Input_Again db CR,LF,CR,LF,'Do you input user name again(y/n)?$'
Start: push cs
pop ds ;使數據段與代碼段同段
push cs
pop es ;使附加段與代碼段同段
Output Prompt_User ;提示輸入用戶名
call GetCursor ;取游標位置
Input_Name: call SetCursor ;置游標位置
lea dx,Buffer ;數據緩沖區地址
mov ah,0ah ;鍵盤緩沖區輸入
int 21h
lea si,Buffer[1] ;實際輸入的字元數地址
lodsb ;取實際輸入的字元數
test al,al ;空串?
jnz Valid_Test ;不是,檢測輸入的用戶是否注冊
Output Empty_Error ;提示用戶名為空
jmp Input_Name ;重新輸入用戶名
Valid_Test: mov cx,Users ;注冊用戶數
lea si,User_Inform ;注冊用戶信息地址
Valid_Test0:cmp al,[si.Name_Lenth] ;輸入的用戶名長度=用戶名實際長度?
jnz Next_One ;不相等,與下一個注冊用戶名比較
push cx
push si
lea si,[si.User_Name]
lea di,Buffer[2] ;實際輸入的用戶名地址
mov cl,al
xor ch,ch
cld
repz cmpsb ;比較用戶名是否已注冊
stc ;進位標志置位,表示用戶名已注冊
jcxz $+3
clc ;進位標志復位,表示用戶名未注冊
pop si
pop cx
jc Input_Pass ;用戶名已注冊,轉去輸入用戶密碼
Next_One: add si,type User ;下一個注冊用戶信息地址
loop Valid_Test0
Output Register_No ;提示:非注冊用戶
call Again_Input ;是否繼續
jc Input_Name ;進位標志置位,轉去重新輸入用戶名
jmp Exit_Proc ;不重新輸入用戶名,結束程序
Input_Pass: mov word ptr Cursor_Row,1
call SetCursor ;置游標位置
Output Prompt_Word ;提示輸入密碼
lea di,Buffer ;密碼緩沖區地址
call Input_PassW ;輸入密碼
jc @@Welcome ;密碼輸入正確,顯示歡迎信息
Output Pass_Error ;提示密碼輸入錯誤
call Again_Input ;是否繼續
jc Input_Pass ;進位標志置位,轉去重新輸入密碼
jmp Exit_Proc ;不重新輸入密碼,結束程序
@@Welcome: Output Welcome ;顯示歡迎信息
Exit_Proc: mov ah,4ch ;結束程序
int 21h
Buffer db 20 ;數據緩沖區
Code ENDS
END Start ;編譯到此結束
Ⅳ 用匯編語言編寫程序
(1)
MOV R0, #80H
MOV R1, #40H
MOV R2, #20
LOOP:
MOVX A, @R0
ADD A, #30H
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
(2)
_DL1S:
MOV R5, #10 ;1T
_DELAY100MS:
MOV R6, #200 ;1T
DL250T:
MOV R7, #250 ;1T
D2:
DJNZ R7, D2 ;2T, 原地攔團轉簡晌橘謹羨移250遍, 共用500T
DJNZ R6, DL250T ;2T, 轉移200遍
DJNZ R5, _DELAY100MS
RET ;2T
Ⅳ 匯編語言 編寫程序
1.
.model small
.386
.data
.code
just_for_test proc far
mov ax,@data
mov ds,ax
mov ax,1234h
push ax
shr ax,4
mov bl,al
and bl,0fh
shr ax,4
mov cl,al
and cl,0fh
shr ax,4
mov dl,al
and dl,0fh
pop ax
and al,0fh
mov ah,4ch
int 21h
just_for_test endp
end
2.
data segment
Ar dw 0,1,2,3,4,5,6,7,8,9
Br dw 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
Cr dw 10 p (?)
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
;-------------------------------
mov si, offset Ar
mov di, offset Cr
mov cx, 10
@C001:
mov ax, [si]
push cx
;-------------------------------
mov bx, offset Br
mov cx, 15
@C002:
mov dx, [bx]
cmp ax, dx
jnz @C003
test ax, 1
jnz @C003
mov [di], ax ; 找到一個在A、B中的偶數
inc di
inc di
@C003:
inc bx
inc bx
loop @C002
;-------------------------------
pop cx
inc si
inc si
loop @C001
;-------------------------------
mov ax,4c00h
int 21h
code ends
end start
自己調去!
Ⅵ 匯編語言程序設計步驟 有那幾步
匯編語言程序設計步驟:1、 分析問題,抽象出描述問題的數據模型 2、 確定問題的演算法思想 3、 畫出流程圖或結構圖 4、 分配存儲器和工作單元(寄存器) 5、 逐條編寫程序 6、 靜態檢查,上機調試 例:編程查找考生的最高分,假設所有考生分數已存入計算機內存.1、 分析問題 根據條件、特點、規律 →數學模型 本例分數已給定為0~200之間的整數集合(考慮加試分) ,記為{S},找max{S}(註:簡單問題不一定寫數學模型) .2、 確定演算法思想 最好利用現成演算法和程序設計方法,若無,則需根據實踐經驗總結演算法思想.如本例,從成績單第一分數往下看,邊看邊比較,記住較高分,舍棄較低分,直至看完,最高分存於 腦中.歸納演算法思想:建立數據指針並指向數據區首地址.將第一數取入寄存器(如AL) ,與下一數比較,若下一數大則將其取入寄存器,否則調整指針,再與下一數比較,重復上述 直至比較完畢,寄存器中即最高分.讀分數用MOV指令,比較用CMP指令,分析判斷用條件轉移指肆宴尺令.3、 畫流程圖或結構圖 有邏輯流程、演算法流程、程序流程等,復雜問題需畫模塊結構.本例簡單,只畫裂高出程序 流程圖(用模塊化結構的N-S流程圖表示) :本例的N-S流程圖 圖中初始化包括:設一個計數器,將分數個數減一後送計數器,每比較一次減一,至 零查找結束;建立一個指針指向數據區.開始 初始化 取第一數到寄存器 與下一數比較 下一數大?是 否 取大數到寄存器 修改指針,計數次數減一 返回到循環體開始,直到計數次數為0退出循環 結束 4、 分配存儲器空間和工作單元(寄存器) 定義數據段、堆棧段、代碼段等.工作單元一般用寄存器.本例:分數放數據段,建100 位元組堆棧空間,BX作數據指針,CX作計數器,AL放最高分.5、 逐條編寫程序 DATA SEGMENT FEN DB 85,90,60,75,87,35,80,78,96,82…… ;存分數 MAX DB ;存最高分 DATA ENDS STACK SEGMENT PARA STACK 『STACK』 DB 100 DUP(?) ;100位元組堆棧 STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR PUSH DS MOV AX,0 PUSH AX ;為了返回DOS MOV AX,DATA MOV DS,AX ;置數據段寄存器 MOV BX,OFFSET FEN ;置數據指針 MOV CX,MAX-FEN ;置計數器初值 DEC CX ;N個分數比較N-1次 MOV AL,[BX] ;取第一個分數 LOP:INC BX ;調整指針 CMP AL,[BX] ;與下一數比較 JAE NEXT ;大於等於則轉 MOV AL,[BX] ;否則取下一數 NEXT:LOOP LOP ;計數器減一,;不為零轉LOP MOV MAX,AL ;存放最高分 RET ;返祥冊回DOS START ENDP CODE ENDS END START 6、 靜態檢查,上機調試 選用指令盡量位元組少,使其執行速度快.易錯處應重點查,如比較次數、轉移條件等.確信無錯後方可上機調試.
Ⅶ 用匯編語言編寫一個簡單程序
1.計算U=(X+(Y*Z-100))/W
其中:X,Y,Z,W均旅純為十六位有符號數。
程序如下:
DATA
SEGMENT
X
DW
10
;16位變數
Y
DW
20
Z
DW
30
W
DW
40
U
DW
?,?
DATA
ENDS
CODE
SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,DATA
MOV
DS,AX
MOV
AX,Y
IMUL
Z
;計算Y*Z,內容放在DX,AX中拆亮咐
MOV
CX,AX
MOV
BX,DX
SUB
CX,100
;計算Y*Z-100
SBB
BX,
0
MOV
AX,X
CWD
;將X符號擴展,形成DX:AX中的雙字
ADD
AX,CX
;計算X+(Y*Z-100),內鍵如容放在DX,AX中
ADC
DX,BX
IDIV
W
;計算(X+(Y*Z-100))/W
MOV
U,AX
MOV
U+2,DX
MOV
AH,4CH
INT
21H
CODE
ENDS
END
START
Ⅷ 匯編語言程序設計的一般步驟是什麼
一、 上機實驗步驟註:以下步驟適用於除匯編語言程序設計的實驗一到實驗四外的所有實驗(實驗一到實驗四僅使用TD.EXE)。1.確定源程序的存放目錄建議源程序存放的目錄名為ASM(或MASM),並放在C盤或D盤的根目錄下。如果沒有創建過此目錄,請用如下方法創建:通過Windows的資源管理器找到C盤的根目錄,在C盤的根目錄窗口中點擊右鍵,在彈出的菜單中選擇「新建」→「文件夾」,並把新建的文件夾命名為ASM。請把MASM.EXE、LINK.EXE、DENUG.EXE和TD.EXE都拷貝到此目錄中。2.建立ASM源程序建立ASM源程序可以使用EDIT或NOTEPAD(記事本)文本編輯器。下面的例子說明了用EDIT文本編輯器來建立ASM源程序的步驟(假定要建立的源程序名為HELLO.ASM),用NOTEPAD(記事本)建立ASM源程序的步驟與此類似。在Windows中點擊桌面左下角的「開始」按鈕→選擇「運行」→在彈出的窗口中輸入「EDIT.COM C:\ASM\HELLO.ASM」,屏幕上出現EDIT的編輯窗口窗口標題行顯示了EDIT程序的完整路徑名。緊接著標題行下面的是菜單行,窗口最下面一行是提示行。菜單可以用Alt鍵激活,然後用方向鍵選擇菜單項,也可以直接用Alt-F打開File文件菜單,用Alt-E打開Edit編輯菜單,等等。如果鍵入EDIT命令時已帶上了源程序文件名(C:\ASM\HELLO.ASM),在編輯窗口上部就會顯示該文件名。如果在鍵入EDIT命令時未給出源程序文件名,則編輯窗口上會顯示「UNTITLED1」,表示文件還沒有名字,在這種情況下保存源程序文件時,EDIT會提示輸入要保存的源程序的文件名。編輯窗口用於輸入源程序。EDIT是一個全屏幕編輯程序,故可以使用方向鍵把游標定位到編輯窗口中的任何一個位置上。EDIT中的編輯鍵和功能鍵符合Windows的標准,這里不再贅述。源程序輸入完畢後,用Alt-F打開File菜單,用其中的Save功能將文件存檔。如果在鍵入EDIT命令時未給出源程序文件名,則這時會彈出一個「Save as」窗口,在這個窗口中輸入你想要保存的源程序的路徑和文件名(本例中為C:\ASM\HELLO.ASM)。 注意,匯編語言源程序文件的擴展名最好起名為.ASM,這樣能給後面的匯編和連接操作帶來很大的方便。3.用MASM.EXE匯編源程序產生OBJ目標文件源文件HELLO.ASM建立後,要使用匯編程序對源程序文件匯編,匯編後產生二進制的目標文件(.OBJ文件)。具體操作如下: 方法一:在Windows中操作用資源管理器打開源程序目錄C:\ASM,把HELLO.ASM拖到MASM.EXE程序圖標上。 方法二:在DOS命令提示符窗口中操作選擇「開始」→「程序」→「附件」→「命令提示符」,打開DOS命令提示符窗口,然後用CD命令轉到源程序目錄下,接著輸入MASM命令:I:>C:<回車> C:>CD \ASM<回車>C:\ASM>MASM HELLO.ASM<回車> 不管用以上二個方法中的哪個方法,進入MASM程序後,都會提示讓你輸入目標文件名(Object filename),並在方括弧中顯示默認的目標文件名,建議輸入目標文件的完整路徑名,如:C:\ASM\HELLO.OBJ〈回車〉。後面的兩個提示為可選項,直接按回車。注意,若打開MASM程序時未給出源程序名,則MASM程序會首先提示讓你輸入源程序文件名(Source filename),此時輸入源程序文件名HELLO.ASM並回車,然後進行的操作與上面完全相同。如果沒有錯誤,MASM就會在當前目錄下建立一個HELLO.OBJ文件(名字與源文件名相同,只是擴展名不同)。如果源文件有錯誤,MASM會指出錯誤的行號和錯誤的原因。4.用LINK.EXE產生EXE可執行文件在上一步驟中,匯編程序產生的是二進制目標文件(OBJ文件),並不是可執行文件,要想使我們編制的程序能夠運行,還必須用連接程序(LINK.EXE)把OBJ文件轉換為可執行的EXE文件。具體操作如下: 方法一:在Windows中操作用資源管理器打開源程序目錄C:\ASM,把HELLO.OBJ拖到LINK.EXE程序圖標上。 方法二:在DOS命令提示符窗口中操作選擇「開始」→「程序」→「附件」→「命令提示符」,打開DOS命令提示符窗口,然後用CD命令轉到源程序目錄下,接著輸入LINK命令:I:>C:<回車> C:>CD \ASM<回車>C:\ASM>LINK HELLO.OBJ<回車>不管用以上二個方法中的哪個方法,進入LINK程序後,都會提示讓你輸入可執行文件名(Run file),並在方括弧中顯示默認的可執行文件名,建議輸入可執行文件的完整路徑名,如:C:\ASM\HELLO.EXE〈回車〉。後面的兩個提示為可選項,直接按回車。注意,若打開LINK程序時未給出OBJ文件名,則LINK程序會首先提示讓你輸入OBJ文件名(Object Moles),此時輸入OBJ文件名HELLO.OBJ並回車,然後進行的操作與上面完全相同。如果沒有錯誤,LINK就會建立一個HELLO.EXE文件。如果OBJ文件有錯誤,LINK會指出錯誤的原因。對於無堆棧警告(Warning:NO STACK segment)信息,可以不予理睬,它不影響程序的執行。如鏈接時有其它錯誤。須檢查修改源程序,重新匯編、連接,直到正確。5.執行程序建立了HELLO.EXE文件後,就可以直接在DOS下運行此程序,如下所示:C:>HELLO〈回車〉C:>程序運行結束後,返回DOS。如果運行結果正確,那麼程序運行結束時結果會直接顯示在屏幕上。如果程序不顯示結果,我們如何知道程序是否正確呢?例如,這里的HELLO.EXE程序並未顯示出結果,所以我們不知道程序執行的結果是否正確。這時,我們就要使用TD.EXE調試工具來查看運行結果。此外,大部分程序必須經過調試階段才能糾正程序執行中的錯誤,調試程序時也要使用TD.EXE。
Ⅸ 匯編語言程序的開發有哪4個步驟
匯編語言程序設計的基本步驟:
1.
分析問題
先全面分析題目,看它給出了什麼條件,有什麼特點,找出規律,歸納出數學模型,也可能判敗有些問題不用寫出數學模型或寫不出數學模型。
2.確定演算法
有了數學模型,或雖然沒有數學模型但已把題目分析清楚了,就選擇一個合適的演算法和適當的數據結構。如果沒有可供選用的現成的演算法和結構,就需要針對具體問題設計一個演算法或結構。
3.繪制流程圖
流程圖就是用圖形的方式把解決問題的演算法直觀地描述出來。對於一個比較復雜的問題,畫出流程圖,這有助於對問題的理解以及有助於編寫出正確的程序。當然,如果演算法陸裂比較簡單,也可不畫流程圖。
4.分配存儲空間和工作單元
用匯編語言編寫程序時,需要給程序中的變數指定內存單元地址或指定寄存器。
5.編寫程序
要把題目中需要處理的數據合理地根據2、3、4步的工作,選用適合的指令,並按一定的語法規則編寫相應的程序。
6.靜態檢查
靜態檢查就是用人工的方式檢查程序是否有錯誤,包括演算法錯誤和語法錯誤等,如果有錯誤,及時改正過來。
7.上掘悉顫機調試運行
任何程序必須經過調試,才能檢查出解題目的是否正確以及程序是否符合設計思想。
Ⅹ 用匯編語言編一個程序,要求如下:
用十進制形式顯示字元位置的代碼如下:
DSEG SEGMENT
msgi db "please input a string:$";顯示信息迅輪,提示輸入一正悄串字元
buf db 50,0
table db 50 p (?);輸入字元串緩沖區
msgd db 0dh,0ah,"the location is:$";顯示信息,提示0所在位置
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG,es:DSEG
MAIN PROC FAR ;主程序入口
mov ax, dseg
mov ds, ax
mov es,ax
lea dx,msgi;顯示信息,提示輸入一串字元
mov ah,9
int 21h
lea dx,buf;輸入字元串
mov ah,0ah
int 21h
lea si,buf
mov cl,[si+1];輸入字元實際個數存入CX中
mov ch,0
lea di,table;輸入字元起始地址存入DI
mov al,30h;要查找的字元0送AL
cld;置方畝清信向標志為地址增量
repnz scasb
jnz tj
lea dx,msgd;顯示信息,提示0所在位置
mov ah,9
int 21h
sub di,offset table
mov bx,di
call disp;用十進制形式顯示位置
tj:
mov ah,1;按任意鍵退出
int 21h
mov ax, 4c00h ;程序結束,返回到操作系統系統
int 21h
MAIN ENDP
disp proc near
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ret
dec_div endp
disp endp
CSEG ENDS
END MAIN