0165-loop 迴圈

波尔發表於2024-07-12

環境

  • Time 2022-11-09
  • WSL-Ubuntu 22.04
  • QEMU 6.2.0
  • NASM 2.15.05

前言

說明

參考:《x86組合語言:從真實模式到保護模式》李忠

目標

使用 loop 迴圈,實現 1 到 100 的加法計算。

彙編程式碼

;計算 1 到 100 相加的結果
mov ax,0
mov cx,100

loop_label:
    add ax,cx
    loop loop_label

jmp $

times 510 - $ + $$ db 0
db 0x55
db 0xAA

loop 指令

loop 指令執行時,透過對 CX 暫存器減一,然後判斷是否大於 0,大於則跳轉到標號處,不大於則向下執行。

執行完的結果

AX: 13BA BX: 0000 CX: 0000 DX: 0080
SI: 0000 DI: 0000 SP: 6F00 BP: 0000
CS: 0000 DS: 0000 ES: 0000 SS: 0000

IP: 7C0A EIP:00007C0A
CS:IP: 0000:7C0A (0x07C0A)
SS:SP: 0000:6F00 (0x06F00)
SS:BP: 0000:0000 (0x00000)
OF <0>  DF <0>  IF <1>  TF <0>  SF <0>  ZF <0>  AF <0>  PF <0>  CF <0>
ID <0>  VIP <0> VIF <0> AC <0>  VM <0>  RF <0>  NT <0>  IOPL <0>
---------------------------[ CODE ]----
=> 0x7c0a:      jmp    0x7c0a
   0x7c0c:      add    BYTE PTR [bx+si],al
   0x7c0e:      add    BYTE PTR [bx+si],al
   0x7c10:      add    BYTE PTR [bx+si],al
   0x7c12:      add    BYTE PTR [bx+si],al
   0x7c14:      add    BYTE PTR [bx+si],al
   0x7c16:      add    BYTE PTR [bx+si],al
   0x7c18:      add    BYTE PTR [bx+si],al
   0x7c1a:      add    BYTE PTR [bx+si],al
   0x7c1c:      add    BYTE PTR [bx+si],al

其中 AX 暫存器中的內容,13BA 就是最終的結果。

總結

使用 loop 指令,計算了 1 到 100 相加的結果,結果儲存在 AX 暫存器。

附錄

相關文章