一文读懂除法溢出-使用汇编重定向0号中端(除法错误中断,比如,执行div指令产生的除法溢出)
生活随笔
收集整理的這篇文章主要介紹了
一文读懂除法溢出-使用汇编重定向0号中端(除法错误中断,比如,执行div指令产生的除法溢出)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在這里假設你已經有8086上的匯編經驗
老規矩先貼出程序在一步一步的注釋講解;
代碼注釋部分
```assemble assume cs:code ;首先安裝程序 也就是將d0程序復制到中斷0指向的代碼段中 ;一下三行代碼的意思就是設置ds:si 指向源代碼 之后使用rep movsb 將源代碼復制到相應的內存單元 ;mov si,offset do0 offset do0 是由編譯器獲取標號的偏移地址 執行之后si 的大小就是 do0程序所在的內存偏移地址大小 start: mov ax,csmov ds,axmov si,offset do0;在中斷向量表中有一段內存是沒有使用的 這里使用的就是沒有使用的0:200h之后的一段內存單元 mov ax,0mov es,axmov di,200h;獲取標號在程序中的位置,由匯編語言處理的符號,功能是取得標號的偏移地址;下面就是借助offset獲取程序的大小mov cx,offset do0end - offset do0 ;cld設置 標志寄存器的df位為0這樣在使用 rep movsb的時候就是正向傳輸 ;std設置df位為1這樣在傳輸的時候就是反向傳輸 ;rep movsb的作用就是將ds:[si]指向的內存單元逐個傳遞到es:[di]指向的內存單元 然后再執行 inc si inc di 使用匯編語言解釋就是 ;解釋開始 ; s: mov es:[di],byte ptr ds:[si] 匯編中并不允許這樣做 這里只是為了解釋下面的語句 ;inc si ;inc di loop s ;結束cld rep movsb ;設置中斷向量表 也就是將0號中斷向量指向安裝好程序的段 的內存單元 ;0號中斷向量表所在的位置為 0:[0*4]到0:[0*4+2]的一段內存單元,所要做的就是因為是大端模式因此按照 ;mov word ptr es:[0*4],200h ;mov word ptr es:[0*4+2],0 的方式存儲mov ax,0mov es,axmov word ptr es:[0*4],200hmov word ptr es:[0*4+2],0mov ax,4c00hint 21hdo0: jmp short do0startdb "overflow!"do0start: mov ax,csmov ds,axmov si,202h ;設置ds:si指向字符串mov ax,0b800hmov es,axov di,12*160 + 36*2 ;設置 es:di指向顯存空間的中間位置mov cx,9 ;設置cx為字符串長度s: mov al,[si]mov es:[di],alinc siadd di,2loop smov ax,4c00hint 21hdo0end:nopcode ends end start“`
總結
以上是生活随笔為你收集整理的一文读懂除法溢出-使用汇编重定向0号中端(除法错误中断,比如,执行div指令产生的除法溢出)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:Anjaneyulu Passal
- 下一篇: ARMCM3汇编指令