汇编指令学习
不寫指令的用法,只寫匯編程序的實現(xiàn)效果,理解匯編指令
dosbox常用指令
r命令:查看或者改變CPU寄存器里的內(nèi)容;查看寄存器:r;改變某個寄存器內(nèi)容:r 寄存器,之后按下enter出現(xiàn):,輸入寄存器 d命令:查看某段內(nèi)存內(nèi)容,查看內(nèi)存內(nèi)容:d 段地址:偏移地址(結(jié)束的偏移地址,可不寫);注:直接使用d命令,顯示的是debug預設地址處內(nèi)容 e命名:改變內(nèi)存內(nèi)容:e 段地址:偏移地址 寫入的數(shù)據(jù) u命令:將機器指令翻譯成匯編;直接使用u會把cpu中CS:IP指向的內(nèi)容翻譯成匯編 t命令:cpu執(zhí)行一條機器指令(CS:IP指向的指令) a命令:以匯編指令的格式在內(nèi)存中寫下機器指令;寫入?yún)R編指令:a 段地址:偏移地址,按下enter輸入?yún)R編指令指令地址CS:IP
數(shù)據(jù)地址DS+偏移地址
棧頂?shù)刂稴S:SP
1.修改段地址方法
MOV ax,2000H MOV ds,ax
執(zhí)行后
棧操作
1.入棧(壓棧)
mov ax,2233 push ax
可以確定棧頂位置為073F:00FB
入棧SP會減2,所以我們的數(shù)據(jù)會送到00F9(只可以送字型數(shù)據(jù))
看一下此時SS:00F9的數(shù)據(jù)
我們把它改成3344
sp果然減2了
看一下棧頂數(shù)據(jù)
2.出棧(彈棧)
pop bx接著上面的數(shù)據(jù)試一下彈棧,棧
首先看見SP棧頂為00fb,cx為8833
pop指令會把SP和SP+1里面的數(shù)據(jù)彈出來,然后SP=SP+2
執(zhí)行一下
SP+2,CX得到2233
3.設置棧
mov ax,2000 mov ss,ax mov sp,10以上操作分別設置了堆棧基地址,然后通過所需容量確定棧頂?shù)刂?br /> 計算公式為
起始地址+設定棧的大小的字節(jié)數(shù)
0000+16(10h)=10H
這一段即為堆棧
壓入兩次2233
注意:堆棧在操作時千萬不可以溢出!!否則SP會跑到其他地方,可能是代碼指令區(qū)
4.用棧進行數(shù)據(jù)交換
設置棧操作push ax push bx pop ax pop bx將ax和bx進行交換
匯編程序
以上對內(nèi)存中的地址直接操作是十分危險的
我們要向安全的內(nèi)存空間寫入內(nèi)容
0:200~0:2FFH
256個字節(jié)
也可以使用操作系統(tǒng)給的內(nèi)存空間
偽指令
段地址聲明
assume cs:code ds:data ss:stack數(shù)據(jù)段聲明
data segement 注:告訴編譯器data段從這里開始內(nèi)容 data ends 注:告訴編譯器data段從這里結(jié)束 分配內(nèi)存代碼段聲明
code segement內(nèi)容 code ends堆棧段聲明
stack segement內(nèi)容 stack ends程序開始聲明
start:內(nèi)容 end start以上并非固定寫法
編譯和鏈接
編譯 masm asm->obj(翻譯)
鏈接link obj -> exe
編譯的時候拆分開來
鏈接的時候再鏈接在一起
編譯鏈接的時候,系統(tǒng)會自動分配各個地址(數(shù)據(jù),代碼,堆棧)
dos功能調(diào)用
鍵盤輸入
單字符,字符位置存放在AL
字符串輸入 字符串存放地址DS:DX
mov AH,0AH int 21H字符串顯示
單字符顯示 要顯示的字符放在DL
字符串顯示 要現(xiàn)實的內(nèi)容放在DS:DX
mov AH,09H int 21H返回DOS
mov Ax 4c00H int 21H總結(jié)