久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

大灰狼的匯編視頻教程筆記(下)

 orion360doc 2014-05-30
2012-08-20 01:13 621人閱讀 評(píng)論(0) 收藏 舉報(bào)

目錄(?)[+]

大灰狼的匯編視頻教程筆記(下)

 (2010-01-22 20:28:57)
標(biāo)簽: 

雜談

分類: 內(nèi)核學(xué)習(xí)
 

時(shí)隔很多年,,重新學(xué)一遍匯編,。覺(jué)得這個(gè)大灰狼學(xué)匯編的視頻很好。

仔細(xì)的聽(tīng),,仔細(xì)的做了筆記,、實(shí)驗(yàn)。感覺(jué)很不錯(cuò),!

 

繼續(xù)加油?。?/p>

 

-------------------12-----------------------------

;;;;;;;;;;;;;boot.asm;;;;;;;;;;;;;;;;;;

;我們的啟動(dòng)程序?qū)崿F(xiàn)很簡(jiǎn)單的功能,,在屏幕中央打印一行字符串即可

org 07c00h ;org指令明確告訴編譯器我程序的段地址是7C00h,,而不是原來(lái)的0000
;int匯編指令 “int 10h”調(diào)用bois里的中斷程序:顯示字符串

 mov ax,cs
 mov es,ax
 mov bp,msgstr  ;es:bp 指向的內(nèi)容就是我們要顯示的字符串地址了
 
 mov cx,12   ;顯示的字符串長(zhǎng)度
 mov dh,12   ;顯示的行號(hào)
 mov dl,36   ;顯示的列號(hào)
 mov bh,0    ;顯示的頁(yè)數(shù)
 mov al,1    ;顯示的是串結(jié)構(gòu)
 mov bl,0ch  ;顯示的字符屬性
 
 mov ah,13h  ;明確調(diào)用13h子程序
 
 msgstr: db "hello my os!"
 int 10h
 times 510-($-$$) db 0  ;重復(fù)n次每次填充值為0
 dw 55aah
 jmp $   ;不斷跳轉(zhuǎn)到當(dāng)前位置,是個(gè)死循環(huán)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

/////////////////write_image.c//////////////////////

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc,char *argv[])
{
 int fd_source;
 int fd_dest;
 int read_count=0;
 char buffer[512]={0};
 fd_source=open("boot.bin",O_RDONLY);
 if(fd_source<0)
 {
  perror("open boot.bin error:");
  return 0;
 }
 fd_dest=open("v1.vfd",O_WRONLY);
 while((read_count=read(fd_source,buffer,512))>0)
 {
  write(fd_dest,buffer,read_count);
  memset(buffer,0,512);
 }
 printf("write image ok!");
 return 0;
}
////////////////////////////////////////////


-----------------13--------------------------------

主要內(nèi)容
實(shí)模式概念
保護(hù)模式概念
選擇子
段描述符
系統(tǒng)地址寄存器

實(shí)模式概念
計(jì)算機(jī)加電后,,cpu就默認(rèn)屬于real-model(實(shí)模式)下
實(shí)模式只能訪問(wèn)地址在1M以下的內(nèi)存稱為常規(guī)內(nèi)存,,我們把地址在1M以上的內(nèi)存稱為擴(kuò)展內(nèi)存。
seg:offset 20位地址,,只能訪問(wèn)1M空間
通過(guò)這種組合指向的內(nèi)存地址就是實(shí)際的物理內(nèi)存地址

32位cpu
intel退出32位cpu時(shí)完全兼容了16位cpu,。
所謂兼容其中很重要的一點(diǎn)就是可以繼續(xù)使用16位的內(nèi)存尋址方式。
  大家都知道16cpu內(nèi)存尋址是通過(guò)段寄存器:通用寄存器來(lái)表示實(shí)際的內(nèi)存地址,。
  32位cpu地址線32根,,最大內(nèi)存為4GB,如何利用原來(lái)的seg:offset(實(shí)現(xiàn)20根地址線)表示方式,,來(lái)表示32根地址線,?
 
保護(hù)模式
在保護(hù)模式下cpu依然使用段寄存器和通用寄存器來(lái)表示內(nèi)存地址,但如何用20位地址來(lái)實(shí)現(xiàn)32位地址線尋址能力?
  有張表,,紀(jì)錄段地址 開(kāi)始地址 大?。ǘ谓缦蓿?屬性
  16位段寄存器紀(jì)錄表的【【索引】】
 
新的內(nèi)容訪問(wèn)思路
在實(shí)模式下,我們把內(nèi)存分成一個(gè)個(gè)內(nèi)存段來(lái)表示,,那么在保護(hù)模式下內(nèi)存也被分為一個(gè)個(gè)內(nèi)存段表示,。
那么我們就把實(shí)現(xiàn)分好的內(nèi)存段信息存入一張表格中,然后段寄存器中保存你要訪問(wèn)內(nèi)存段所在的這張表格的索引,。
  保存表中索引的段寄存器,,我們稱為段選擇子。
  表中每個(gè)表示32位內(nèi)存段信息我們稱之為段描述符,。
  整張表稱之為【【段描述符表】】,。
 
段選擇子
  段選擇子16位(段寄存器16位),其中高13位存放描述符表中的索引,,其低3位用來(lái)表示段描述符表中所指向的段描述符的屬性,。
  因此表中段描述符最大個(gè)數(shù)為2^13=8096個(gè)。
  TI(Table Indicator):用來(lái)表示是從全局描述符表中讀取描述符還是從局部描述符表中讀取描述符,。
  RPL(Request Priviledge Level):用于特權(quán)檢查.
 
形成物理地址
  段寄存器-(索引號(hào))-->段描述符表--->段描述符A--->線性地址空間(物理地址)     不考慮分頁(yè)時(shí),,線性地址=物理地址

段描述符結(jié)構(gòu)
  既然段描述符包含了段的開(kāi)始地址和段的界限,那么了解該結(jié)構(gòu)至關(guān)重要
    段描述符共8個(gè)字節(jié),,每個(gè)字節(jié)都具有具體含義
    段界限(segment limit)20位被分為兩個(gè)部分,第一部分保存在1,,2字節(jié)中,,第二部分保存在7
    段基地址(segment base)32位被分成兩個(gè)部分,第一部分23個(gè)字節(jié)被存放在3,,4,,5字節(jié)中,第二部分放在8
    段屬性(attributes)包含了該段屬性和段界限的第二部分
    段基地址剩余部分(base)包含了段界限剩余的8位
   
內(nèi)存分配
  由于我們現(xiàn)在編寫的在裸機(jī)上編寫程序,,因此內(nèi)存必須我們自己在4GB內(nèi)存中進(jìn)行分配 
-----------------14--------------------------

段屬性
  段屬性位于段描述符的第6和第7個(gè)字節(jié),,用來(lái)描述該段是數(shù)據(jù)段還是代碼段或者堆棧段,對(duì)于數(shù)據(jù)段或者堆棧段來(lái)說(shuō)是否可讀是否可寫,,
  對(duì)于代碼段來(lái)說(shuō)是否可執(zhí)行以及段描述符所指定的內(nèi)存段在物理內(nèi)存中是否存在,。
  從左往右
  0~3 TYPE  :說(shuō)明存儲(chǔ)段描述符所描述的存儲(chǔ)段的具體屬性。是屬于代碼段還是數(shù)據(jù)段,,可讀可寫還是可執(zhí)行,。
  4   DT    :說(shuō)明了該描述符所指定的系統(tǒng)端描述符海華絲存儲(chǔ)段描述符。
  5~6 DPL   :表示描述符特權(quán)級(jí)別,。
  7   P     :表示描述符對(duì)地址的轉(zhuǎn)換是否有效,。
  第二個(gè)字節(jié)
  0~3 Limit :段界限第二部分剩余的4位。
  4   AVL   :軟件可利用完,80386對(duì)該位未做規(guī)定
  5         :0
  6   D     :表示如果該段是代碼段,,是否是16位還是32位代碼段,,如果該段是數(shù)據(jù)段是否是16還是32位,1表示32位
  7   G     :段界限粒度位G=0表示段邊界64k,,G=1表示段邊界4GB
 
段界限
  我們既然分了8M的內(nèi)存段,,那么段界限就是8M,那么8M占用多少字節(jié),,怎樣用16進(jìn)制表示并爭(zhēng)取填充到段描述符中呢,?
  8M=2^23=800000H
    不能直接把800000這個(gè)16進(jìn)制直接寫段描述符的相應(yīng)位置中,并且20位的段界限 23位二進(jìn)制數(shù)如何解決,?
  段界限公式
    段界限=limit*4k+0FFFH
    800000=limit*4k+0FFFH
  limit就是要填寫到段描述符中的段界限位置
  limit=(800000-0FFFH)/4k=7FFH
 
段描述符的填寫
  我們的偏移地址都是通過(guò)8M通過(guò)公式得出段界限為7FF
  我們第一個(gè)內(nèi)存的段從內(nèi)存00000處開(kāi)始,,所以段基地址全為0
  那么我們創(chuàng)建的段位數(shù)據(jù)段并且是可讀可寫的,那么就必須在attributes字段中填寫相應(yīng)的數(shù)據(jù),。
  base    attributes     segment base           segment limit
  0000                   000000000000           07FF
 
  TYPE :我們定義的是數(shù)據(jù)段并且我們要求該段可讀可寫那么tpye值填為0010,,如果我們創(chuàng)建的是代碼段可讀可執(zhí)行,那么為1010
  DT   :DT用來(lái)區(qū)別系統(tǒng)段還是存儲(chǔ)段,,我們這邊都是存儲(chǔ)段,。
  DPL  :表示內(nèi)存段的權(quán)限,這里為00表示
  P    :表示描述符對(duì)地址轉(zhuǎn)換是否有效,,1表示有效
  Limit:表示剩余4位段界限描述符 0000
  AVL  :保留為0
  D    :1  我們編寫的是保護(hù)模式,,32位
  G    :1
 
數(shù)據(jù)段描述符
  根據(jù)以上內(nèi)容我們可以定義符合數(shù)據(jù)段描述符的匯編代碼
    dw 07FFh        ;段界限
    dw 0h           ;段基地址0~18位
    db 0h           ;段基地址19~23位
    db 10010010b    ;段描述符的第6個(gè)字節(jié)屬性(數(shù)據(jù)段可讀可寫)
    db 11000000b    ;段描述符的第7個(gè)字節(jié)屬性
    db 0            ;段描述符的最后一個(gè)字節(jié)也就是段基地址的第二部分
   
代碼段描述符
  代碼段描述符和數(shù)據(jù)段描述符基本一致,不同在于段基地址和段屬性
  dw 07FFh          ;段界限(保持不變)
  dw 1h             ;段基地址0~18位                                   不同
  db 80h            ;段基地址19~23位                                  不同
  db 10011010b      ;段描述符的第6個(gè)字節(jié)屬性(代碼段可讀可執(zhí)行)          不同
  db 11000000b      ;段描述符的第7個(gè)字節(jié)屬性
  db 0              ;段基地址的第二部分
 
 
----------------------15---------------------------------

Intel規(guī)定描述符表的第一個(gè)描述符必須是空描述符,,也就是第一個(gè)描述符全部填充為0

DTR寄存器
  全部定義好數(shù)據(jù)段和代碼段描述符后,,我們知道這個(gè)描述符表是存在了內(nèi)存的某個(gè)位置,
  那么CPU如何取得這描述符表所在的位置以及大???
    我們必須把剛剛創(chuàng)建好的描述符表所在地址和長(zhǎng)度保存起來(lái)供CPU使用
    80386CPU有個(gè)專門保存描述符表的48位寄存器稱之為GDTR寄存器
    GDTR寄存器共48位:32位描述符表基地址    16位描述符表界限

gdtr匯編指令
  通過(guò)lgdt匯編指令可以把GDTR描述符表的大小和起始位置存入gdtr寄存器中,指令格式如下:
    lgdt    [描述段描述符表的地址]
   
A20地址線
  早期的8086只有20根地址線,,只能訪問(wèn)1M的地址空間,。CPU尋址則按段+偏移的方式進(jìn)行。
  在32位CPU情況下,,如果內(nèi)存訪問(wèn)到1M內(nèi)存尾部時(shí)再向下訪問(wèn)將會(huì)出現(xiàn)什么情況,?
    16位段+16位偏移的可能范圍是0-0x10FFEF(即0xFFFF0+0xFFFF),即1M+65520自字節(jié)的范圍,。
    由于只有20根地址線,,所以在對(duì)1M~1M+65520范圍進(jìn)行訪問(wèn)時(shí)會(huì)發(fā)生“地址回繞”的現(xiàn)象,
    就是說(shuō)實(shí)際會(huì)訪問(wèn)到0~65520的地方,。
    在32位CPU下不會(huì)產(chǎn)生地址回繞,,但有些16位程序正是利用地址回繞特性來(lái)編寫的,,
    那么如何兼容這些程序呢?
  讓32位德二進(jìn)制數(shù)據(jù)高12位清空為0,,剩下的低20二進(jìn)制數(shù),,如何實(shí)現(xiàn)呢。
  我們只讓32位數(shù)據(jù)和高全為0低全為1的數(shù)相與操作,。

;;;;;;;;;;;;;;;;;;;boot.asm,增加了gdt_data等;;;;;;;;;;;;;;;;;;;;;;;;;;

;我們的啟動(dòng)程序?qū)崿F(xiàn)很簡(jiǎn)單的功能,,在屏幕中央打印一行字符串即可

org 07c00h ;org指令明確告訴編譯器我程序的段地址是7C00h,而不是原來(lái)的0000
;int匯編指令 “int 10h”調(diào)用bois里的中斷程序:顯示字符串
gdt_table_start:
 gdt_null:
  dd 0h
  dd 0h    ;Intel規(guī)定段描述符表的第一個(gè)表項(xiàng)必須為0
 gdt_data_addr     equ   $-gdt_table_start
 gdt_data:
  dw 07FFh         ;段界限
      dw 0h           ;段基地址0~18位
      db 0h           ;段基地址19~23位
      db 10010010b    ;段描述符的第6個(gè)字節(jié)屬性(數(shù)據(jù)段可讀可寫)
      db 11000000b    ;段描述符的第7個(gè)字節(jié)屬性
      db 0            ;段描述符的最后一個(gè)字節(jié)也就是段基地址的第二部分
 gdt_code_addr     equ   $-gdt_table_start
 gdt_code:
    dw 07FFh         ;段界限(保持不變)
    dw 1h             ;段基地址0~18位                                   不同
    db 80h            ;段基地址19~23位                                  不同
    db 10011010b      ;段描述符的第6個(gè)字節(jié)屬性(代碼段可讀可執(zhí)行)          不同
    db 11000000b      ;段描述符的第7個(gè)字節(jié)屬性
    db 0              ;段基地址的第二部分
gdt_table_end:
 gdtr_addr:
  dw gdt_table_end-gdt_table_start-1  ; 段描述符表長(zhǎng)度
  dd gdt_table_start   ; 段描述符表基地址
 lgdt  [gdtr_addr]                          ;讓CPU讀取gdtr_addr所指向內(nèi)存內(nèi)容保存到GDT內(nèi)存當(dāng)中

;A20地址線問(wèn)題

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


-----------------------16---------------------------------------
A20地址線
  由于在當(dāng)時(shí)的8042鍵盤控制器上恰好有空閑的端口引腳,,于是使用了該引腳昨晚與門控制這個(gè)地址比特位,。
  該信號(hào)即被稱為A20。如果它為0,,則比特20及以上地址都被清除,。從而實(shí)現(xiàn)了兼容性。
  由于鍵盤的控制器速度很慢,,因此就不能使用鍵盤對(duì)A20線來(lái)進(jìn)行操作,,
  為此引進(jìn)了一個(gè)A20快速門選項(xiàng)(Fast Gate A20),它使用I/O端口0x92來(lái)處理A20信號(hào)線,,避免了使用慢速的鍵盤控制器操作方式。
 
端口概念
  在計(jì)算機(jī)系統(tǒng)中,,所有設(shè)備都和CPU相連接,,盡管相連接但CPU不能直接跟外圍設(shè)備進(jìn)行交互數(shù)據(jù),
  CPU只能和每個(gè)設(shè)備的寄存器交互數(shù)據(jù),然后再由寄存器把數(shù)據(jù)傳給設(shè)備,。
  那么我們給每個(gè)設(shè)備的寄存器進(jìn)行編號(hào),,這些編號(hào)就稱之為【【端口號(hào)】】。

端口的讀
  我們用in匯編命令來(lái)讀取設(shè)備寄存器中的內(nèi)容,,格式如下:
    in accum port
  其中port就是要讀取的端口號(hào),accum表示把port端口號(hào)的內(nèi)容放到accum中,。accum必須是AL或者AX,。
  該命令的含義就是讀取port端口號(hào)內(nèi)容到AL或者AX寄存器中。

端口的寫
  我們使用out匯編指令往指定設(shè)備中寫入數(shù)據(jù),,格式如下:
    out port accume
  該命令含義是把a(bǔ)ccume中的值寫入port端口中,。

開(kāi)啟A20地址線
  32位計(jì)算機(jī)加電時(shí)默認(rèn)情況是關(guān)閉A20地址線的,CPU要轉(zhuǎn)入保護(hù)模式都必須開(kāi)啟A20地址線,,如何開(kāi)啟呢,?
  A20地址線代碼如下:
    in    al,92h
    or    al,00000010b
    out   92h,al

cli匯編指令
  在轉(zhuǎn)入保護(hù)模式之前,我們必須廢除原來(lái)的中斷向量表,。
  在匯編語(yǔ)言中使用cli匯編指令來(lái)廢除實(shí)模式下的中斷向量表,。
  這就意味著在保護(hù)模式下必須重新建立32位的中斷向量表和中斷處理程序,。
 
轉(zhuǎn)入保護(hù)模式
  當(dāng)我們一切準(zhǔn)備好之后,如何明確的告訴CPU我們要進(jìn)入保護(hù)模式,?
    80386提供了4個(gè)32位的控制寄存器CR0~CR3,。
    其中控制寄存器CR0中某些位時(shí)用來(lái)標(biāo)識(shí)是否要進(jìn)入保護(hù)模式。
    CR1寄存器保留沒(méi)有被使用,。
    CR2和CR3用于分頁(yè)機(jī)制(不屬于討論范圍)
 
CR0寄存器
  31    PG  控制分頁(yè)管理機(jī)制,。PG=0,禁用分頁(yè)管理機(jī)制,,此時(shí)分段管理機(jī)制產(chǎn)生的線性地址直接作為物理地址使用,。
                             PG=1,啟用分頁(yè)管理機(jī)制,,此時(shí)線性地址經(jīng)分頁(yè)管理機(jī)制轉(zhuǎn)換物理地址,。
  30~5 
  4     ET
  3     TS
  2     EM
  1     MP
  0     PE  控制分段管理機(jī)制,PE=0,,處理器運(yùn)行于實(shí)模式;PE=1,,處理器處于保護(hù)模式

設(shè)置CR0寄存器
  只要對(duì)CR0寄存器的第一位置設(shè)為1,就表示要轉(zhuǎn)入保護(hù)模式,,那么在匯編代碼中如何實(shí)現(xiàn)呢,?
     mov eax,cr0
     or  eax,1
     mov cr0,eax
 
    
-----------------------17----------------- ---  

保護(hù)模式下段寄存器
  在386保護(hù)模式下,CPU的物理內(nèi)存依然是段寄存器內(nèi)容加偏移地址形成線性地址,。
  段寄存器內(nèi)容表示段描述符表中的索引(或者說(shuō)段描述符所在的段描述符表的位置),。


-----------------------18---------------------

bochs是c++編寫的開(kāi)源跨平臺(tái)的虛擬機(jī),具有良好的可移植性,??梢詫?duì)操作系統(tǒng)進(jìn)行調(diào)試時(shí)它最大的特色。
  continue(c) 程序繼續(xù)運(yùn)行知道遇到斷點(diǎn)為止,。
  step(s)     單步跟蹤,。
  vbreak(vb)  在虛擬地址上設(shè)置一個(gè)斷點(diǎn)。    vb 段地址:偏移地址
  pbreak(b)   在物理地址上設(shè)置一個(gè)斷點(diǎn),。     
  lbreak(lb)  在線性地址上設(shè)置一個(gè)斷點(diǎn),。
  disassemble 反匯編指令。
 
  info b  顯示斷點(diǎn)
 
 
-----------------------19---------------------

bug
  我們實(shí)際的代碼段和數(shù)據(jù)段的基地址是由我們代碼中的data_32和code_32來(lái)表示的,。
  我們要修改代碼段描述符和數(shù)據(jù)段描述符跟段基地址有關(guān)的字節(jié),。
  根據(jù)描述結(jié)構(gòu)我們只要修改3,4,,5,,8這幾個(gè)字節(jié)的內(nèi)容,填上我們新的及地址就可以了,。

;;;;;;;;;;;;;;;;;;;boot.asm;;;;;;;;;;;;;;;;;;;;;;;;
;我們的啟動(dòng)程序?qū)崿F(xiàn)很簡(jiǎn)單的功能,,在屏幕中央打印一行字符串即可
[BITS 16]
org 07c00h ;org指令明確告訴編譯器我程序的段地址是7C00h,,而不是原來(lái)的0000
    ;int匯編指令 “int 10h”調(diào)用bois里的中斷程序:顯示字符串
jmp main
gdt_table_start:
 gdt_null:
  dd 0h
  dd 0h    ;Intel規(guī)定段描述符表的第一個(gè)表項(xiàng)必須為0
 gdt_data_addr     equ   $-gdt_table_start
 gdt_data:
  dw 07FFh         ;段界限
      dw 0h           ;段基地址0~18位
      db 0h           ;段基地址19~23位
      db 10010010b    ;段描述符的第6個(gè)字節(jié)屬性(數(shù)據(jù)段可讀可寫)
      db 11000000b    ;段描述符的第7個(gè)字節(jié)屬性
      db 0            ;段描述符的最后一個(gè)字節(jié)也就是段基地址的第二部分
  gdt_video_addr    equ   $-gdt_table_start
  gdt_video:            ;用來(lái)描述顯存地址空間的段描述符
    dw     0FFh       ;顯存段界限就是1M
    dw     8000h     
    db     0Bh
    db     10010010b
    db     11000000b
    db     0
    
 gdt_code_addr     equ   $-gdt_table_start
 gdt_code:
    dw 07FFh         ;段界限(保持不變)
    dw 1h             ;段基地址0~18位                                   不同
    db 80h            ;段基地址19~23位                                  不同
    db 10011010b      ;段描述符的第6個(gè)字節(jié)屬性(代碼段可讀可執(zhí)行)          不同
    db 11000000b      ;段描述符的第7個(gè)字節(jié)屬性
    db 0              ;段基地址的第二部分
gdt_table_end:
 gdtr_addr:
  dw gdt_table_end-gdt_table_start-1  ; 段描述符表長(zhǎng)度
  dd gdt_table_start   ; 段描述符表基地址

 ;A20地址線問(wèn)題
main:
  xor eax,eax
  add eax,data_32
  mov word [gdt_data+2],ax
  shr eax,16
  mov byte [gdt_data+4],al
  mov byte [gdt_data+7],ah
 
  xor eax,eax
  add eax,code_32
  mov word [gdt_code+2],ax
  shr eax,16
  mov byte [gdt_code+4],al
  mov byte [gdt_code+7],ah
  ;初始化代碼段描述符的基地址
 
 cli
 lgdt  [gdtr_addr]                          ;讓CPU讀取gdtr_addr所指向內(nèi)存內(nèi)容保存到GDT內(nèi)存當(dāng)中
 enable_a20:
   in  al,92h
   or  al,00000010b
   out 92h,al
 
 ;設(shè)置cr0寄存器第一位為1
 mov eax,cr0
      or  eax,1
      mov cr0,eax
 ;跳轉(zhuǎn)到保護(hù)模式中
 jmp gdt_code_addr:0
[BITS 32]
 ;保護(hù)模式的功能就是屏幕中央打印hello world
 data_32:
   db "hello world"
 code_32:
   mov ax,gdt_data_addr
   mov ds,ax
   mov ax,gdt_video_addr
   mov gs,ax
 
   mov cx,11   ;顯示的字符串長(zhǎng)度
   mov edi,(80*10+12)*2   ;在屏幕中央顯示
   mov bx,0
   mov ah,0ch 
 s:mov al,[ds:bx]
   mov [gs:edi],al
   mov [gs:edi+1],ah
   inc bx
   add edi,2
   loop s
   jmp $
   times 510-($-$$) db 0 
   dw 0aa55h

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多