宣告

.data
	str    BYTE    "this is a string", 0    ;8bit
  var1   WORD    ?                        ;16bit
  var2   DWORD   10 DUP(0)                ;32bit
  var3   SDWORD  1, 2, 3, 4, 5            ;64bit

輸出字串

str    BYTE    "this is a string", 0    ;8bit

mov     edx, OFFSET str            
call    WriteString
call    Crlf                            ;換行

讀取輸入

call    ReadDec      ;讀取使用者輸入數字存進eax(會顯示)

call    ReadChar     ;讀取使用者的輸入字元存進eax(不會顯示)
call    WriteChar    ;輸出使用者的輸入

暫存器操作

call    ReadDec
call    ReadChar   ;讀取函式將內容存進eax
call    WriteDec
call    WriteChar  ;打印函式打印eax內容

loop    forloop    ;使用ecx計數

movzx   eax,  al   ;8bit擴展到32bit  ;eax 32bit, ax 16bit, ah/al 8bit
mov     bx,   ax   ;32bit(eax)縮減到16bit 要使用ax 如果要移動高位元的部分要先右移

比較 (p.236)

cmp     register,  register/var

jmp     jump                      ;無條件跳轉
je      jump_if_equal
jne     jump_if_not_equal

jl      jump_if_less              ;left < right
jle     jump_if_less_or_equal     ;left <= right
jg      jump_if_greater           ;left > right
jge     jump_if_greater_or_equal  ;left >= right

陣列處裡

array    WORD    10 DUP(?)

mov     esi, OFFSET array       ;取得array起始的位址
mov     ecx, LENGTHOF array     ;取得array元素長度
;mov    ecx, SIZEOF array       ;取得array位址長度(10*2=20) ;BYTE:1, WORD:2.....

InputLoop:
      call    ReadInt             ;讀取使用者輸入    

      mov     word ptr [esi], ax  ;將輸入的值存入array 因為是32 > 16所以用ax
      add     esi, 2              ;移動到下一個index <根據array的data type加不同偏移量>
      loop    InputLoop

mov     ecx, LENGTHOF array
OutputLoop:
      movzx   eax, word ptr [esi] ;將array index值存入eax 因為是16 > 32所以用movzx
      call    WriteDec            ;印出eax
      call    Crlf                ;換行
      add     esi, 2              ;移動到下一個idnex
      loop    OutputLoop

計算(p.290)

ADC/SBB : 考慮進/借位的計算

Untitled

Untitled

;  EDX  EAX  /  Div  =  EAX  +  EDX   
;    0   40  /    4  =   10  +    0
mov     eax, 40
mov     bl,  4
div     bl       ;eax = 10

亂數