天天看點

彙編語言完成1到100累加-3引言程式環境程式邏輯代碼實踐結果資源

如何完成1到100的累加,并把結果顯示到螢幕上,

使用對戰儲存資料

引言

簡單介紹本次實踐,需要用的知識點。

堆棧

使用前設定ss堆棧段的寄存器,設定sp棧頂偏移位址,此處都為0,

原因是主引導程式從0x7c00開始,那麼兩個是不是沖突呢?後每次壓棧時,SP 都要依次減 2,即 0x0000-0x0002=0xFFFE于是與主引導程式是不會沖突的。

push,  sp-2  
pop,	sp+2
           
彙編語言完成1到100累加-3引言程式環境程式邏輯代碼實踐結果資源

cmp

cmp 指令在功能上和 sub 指令相同,唯一不同之處在于,cmp 指令僅僅根據計算的結果設定相應的标志位,而不保留計算結果,是以也就不會改變兩個操作數的原有内容。cmp 指令将會影響到CF、OF、SF、ZF、AF 和 PF 标志位。

根據這些标注為的變化我們就可以用條件轉移指令了。

彙編語言完成1到100累加-3引言程式環境程式邏輯代碼實踐結果資源

or指令

邏輯或,有1則1,沒有則0

程式環境

NASM 編譯器版本 :nasm-2.07

IDE :vs code

虛拟機: oracle vm virtualBox 最新版

寫入工具:fixvhdwr.exe

程式邏輯

循環100次 (這裡使用cmp修改标志位,利用轉移指令進行循環)累加1到100,結果存入到ax中,div 10 将 餘數push到棧中,這裡不在是如上篇div 5次了,而是利用cmp 去根據商的結果是否需要繼續求餘數,如果是0則跳過。求餘數結束後,用pop出棧資料,并顯示到螢幕上。

代碼

; 完成1到100累加,并顯示在螢幕上


jmp near start

message db "1+2+3+...+100="


start:
    mov ax,0x7c0
    mov ds,ax
    mov ax,0xb800
    mov es,ax

    mov si,message
    mov di,0        ;除了作為通用寄存器使用外,還專門用于和外設之間進行資料傳送
    mov cx,start-message

@g:
    mov al,[si]
    mov ah,0x07
    mov [es:di],ax
    inc di
    inc di
    inc si
    loop @g

    xor ax,ax
    mov cx,1

@f:
    add ax,cx
    inc cx
    cmp cx,100
    jle @f

    ; 這裡使用棧,ss為棧頂的短位址,sp是相對棧頂的偏移
    ; 當使用  PUSH 指令向棧中壓入 1 個位元組單元時,SP = SP - 1;即棧頂元素會發生變化;
    ; 而當使用  PUSH 指令向棧中壓入  2 個位元組的字單元時,SP = SP – 2 ;即棧頂元素也要發生變化;
    ; 當使用  POP 指令從棧中彈出 1 個位元組單元時, SP = SP + 1;即棧頂元素會發生變化;
    ; 當使用  POP 指令從棧中彈出 2 個位元組單元的字單元時, SP = SP + 2 ;即棧頂元素會發生變化;

    xor cx,cx
    mov ss,cx
    mov sp,cx

    ; div  ,ax被除數、結果商也會存到這,dx餘數
    mov bx,10
@d:
    inc cx
    xor dx,dx
    div bx
    ; 這裡可以等效 add ,
    ; 原因是  dl的高位都是0,0x30低位是0,是以或操作不會影響al低位的餘數
    or dl,0x30      
    push dx
    cmp ax,0
    jne @d    

    ;以下顯示各個數位 
@a:
    pop dx
    mov [es:di],dl
    inc di
    mov byte [es:di],0x04
    inc di
    ; 循環直到cx為0
    loop @a


jmp near $

times 510-($-$$)db 0
    db 0x55,0xaa


           

實踐結果

nasm.exe -f bin  .\Learn.ASM -o  learn.bin
編譯代碼,生成二進制檔案。
寫入到虛拟機的vhd裡。運作虛拟機顯示如下
           
彙編語言完成1到100累加-3引言程式環境程式邏輯代碼實踐結果資源

資源

彙編代碼及二進制檔案:https://github.com/duofanCoder/x86-NASM/tree/master/ASM-Learn-3/code

虛拟機固定大小硬碟vhd檔案:https://github.com/duofanCoder/x86-NASM/tree/master/ASM-Learn-3

vhd寫入工具:https://github.com/duofanCoder/x86-NASM/tree/master/tools