彙編學習筆記 4 電話號查詢 檔案指標讀取檔案

2021-08-10 04:33:45 字數 3550 閱讀 6804

首先在乙個文字檔案中寫入一些**號碼,為了讀取的方便,指定它們有固定的格式,並且以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系統中檔案的路徑方式...