首先在乙個文字檔案中寫入一些**號碼,為了讀取的方便,指定它們有固定的格式,並且以dollar串結束符結束,便於用3fh號功能讀取檔案和09h號功能輸出。
注意,雖然3fh號功能讀入的東西,在輸出時到串結束符就沒有了,這只是因為09h號功能的結束時在串結束符dollar符,在3fh號功能的使用時還是要決策好要讀入的字元數目。
另外兩個新的知識是,3dh號功能開啟檔案,以及用42h號功能移動檔案指標(有至少三種移動方式,根據al的值來指定)。
datas segment
wj db 'd:\tel.txt',00h ;檔案路徑
hand dw ? ;檔案代號
ls2 db 20 dup(?),'$' ;小臨時空間
namen db 7 ;表示最多存7個字元
db ? ;預留!儲存實際存的字元數
db 6 dup (?) ;接收輸入串
db '$','$' ;這裡完全是我的無能之舉!
nostr db 'not find','$' ;找不到
pian dw 00h ;偏移量
telnum db 4 ;**號碼數量
hh db 0ah,0dh,'$' ;換行回車
datas ends
codes segment
assume cs:codes,ds:datas
start:
mov ax,datas
mov ds,ax
;--------輸入名字----------
lea dx,namen
mov ah,0ah ;0a號功能接受輸入到緩衝區
;ds:dx=緩衝區首位址
;(ds:dx)儲存緩衝區最大字元數
;(ds:dx+1)儲存實際輸入字元數
int21h lea dx,hh
mov ah,09h
int21h mov bh,0
mov bl,ds:namen[1] ;int i=名字的字元數
buquan: ;補全
mov dl,'-' ;補全用的字元
mov ds:namen[bx+2],dl ;從+2位置開始字元補全
add bx,1 ;游標+1右移
cmp bx,7 ;到7說明結束了
jb buquan ;不到7要繼續補全
lea dx,namen[2]
mov ah,09h
int21h ;換行
lea dx,hh
mov ah,09h
int21h ;-------開啟檔案-----------
mov ah,3dh ;開啟檔案的操作
mov al,00 ;唯讀
lea dx,wj ;把檔案路徑的位址給dx
int21h ;幹活
jc error ;出錯跳轉
;執行到這裡後,檔案代號將在ax裡
mov hand,ax ;存進hand裡
myxun: ;主迴圈
;-------移動檔案指標-------
mov ah,42h ;移動檔案指標
mov cx,0
mov dx,pian ;cx:dx是偏移量
add pian,22 ;偏移量每次加22(算上回車換行!)
mov al,0 ;移動方式:從頭開始算
mov bx,hand ;檔案代號給bx
int21h ;---------讀取-------------
mov ah,3fh ;讀檔案的操作
mov bx,hand ;檔案代號給bx
mov cx,20 ;要讀的長度給cx,注意要正好!
lea dx,ls2 ;要讀到的位置給dx
int21h jc error ;錯誤跳轉
;執行好讀後,實際讀的位元組數在ax裡
;---------比較名字---------
mov bx,0 ;比較用的游標初始化
mov cx,7 ;比較7個字元
cmpname:
mov dl,ds:ls2[12+bx]
cmp ds:namen[bx+2],dl ;逐個字元作比較
jne thisno ;不同時跳轉
inc bx ;游標增加
loop cmpname ;相同時繼續迴圈比較
;如果執行到這句,說明比較結果是一致
jmp shuchu ;一致則跳轉到輸出結束
thisno: ;到這裡說明本次比較是不一致的
dec telnum ;每次telnum-1
cmp telnum,0 ;和0比較一下
je none ;到0了說明沒找到
jmp myxun ;否則繼續主迴圈
shuchu:
;---------輸出-------------
lea dx,hh
mov ah,09h
int21h lea dx,ls2 ;串位址給dx
mov ah,09h ;顯示字串的操作
int21h error: ;直接結束
mov ah,4ch
int21h none: ;沒找到
lea dx,hh
mov ah,09h
int21h lea dx,nostr
mov ah,09h
int21h int
21h jmp error
codes ends
end start
在讀入名字後,用減號對名字進行補全,補全到7位,這樣就可以和檔案中的記錄保持格式上的一致性,並且每次只要把cx置7(補全之後總是7位的名字),就能很方便地一位一位地作字元比較。
這樣做的另乙個好處是,如果乙個名字是另乙個名字的字首串,如tom於tommy是字首串,也不會發生錯誤。例如在這個檔案中tom是tommy的字首串,甚至還在tommy的前面,仍然能判斷兩者並不相同,而只作名字長度的迴圈是不能避免這個問題的。
彙編學習筆記4
第三講講的是暫存器,第四講仍然介紹暫存器。在第三講裡,介紹了8086,8088cpu共有14個16位暫存器,8個8進製暫存器,分別為16位資料暫存器ax,bx,cx,dx,8位暫存器ah,al,bh,bl,ch,cl,dh,dl等,指標暫存器bp,sp等,變址暫存器si,di等以上八個16位暫存器稱...
反彙編學習筆記4 ADRP
sp 需要16位對齊 函式引數從x0開始呼叫 常量的獲取 adrp 指令 adr address p page adrp x0,x1 第一步 將1的值左移12位 1 0000 0000 0000 0x1000 第二步 將pc暫存器的低12位清零 第三步 將前兩步的結果相加,放入x0暫存器 adrp是...
Lawliet Python學習筆記4 檔案處理
讀檔案函式 a.read size a.readline size a.readlines hint 寫檔案函式 a.wirte s a.writelines lines a.seek offset 變數名 open 檔名 開啟模式 檔名 檔案路徑和名稱 絕對路徑 windows系統中檔案的路徑方式...