Cách cho vòng lặp không mất khi xài lệnh jmp


em mới làm bt thầy giao, em có tìm hiểu về mk cái loop và if else trong assembly nhưng ko hiểu cơ chế thoát vòng lặp chp lắm, ví dụ như bài số 1: em muốn cho nó lặp đến khi nào tìm được ước thì xuất ra và lặp tiếp nhưng nó chỉ xuất ra chứ không lặp tiếp ạ, anh/ chị nào chỉ em với , em cảm ơn

JMP là lệnh nhảy vô điều kiện mà bạn! :smiley:

4 Likes
include \masm32\include\masm32rt.inc
.data
    var1 dd 0
    var2 dd 0
    var3 dd 0
.code

start:
    mov var1, sval(input("Enter a number : "))
    mov edx,0
    mov eax,0
    mov ebx,0
    lap:
    cmp var3,0 ;var3=0
    jne xuat
    print str$(ebx)
    print chr$(13,10)
    mov eax,var1
    inc ebx
    mov ecx,ebx
    div ecx
    mov var3,edx
    loop lap
    xuat: 
    jmp lap
 exit

end start

mình xài jne nữa mà ko ra :<

Bạn tự thêm code để in ra cho đẹp nhé, đây chỉ là code cơ bản thôi

# mặc định ban đầu ebp == esp, các lệnh call đều theo stdcall
start:
  sub esp, 4 # int n;
  call input # eax = input()
  mov dword ptr ss:[ebp - 4], eax # n = eax
  mov ecx, 1 # int i = 1
loop:
  mov eax, dword ptr ss:[ebp - 4]
  cmp ecx, eax # i <= n
  ja end # jmp nếu bên trên sai
  xor edx, edx # dọn edx (edx = 0)
  div ecx # edx = n % i, eax = n / i
  test edx, edx # edx == 0
  jnz afterPrint # jmp nếu bên trên sai
  push ecx
  call print # print(i)
afterPrint:
  inc ecx
  jmp loop
end:
  add esp, 4 # dọn stack
  ret # return

loop instruction đếm ngược về 0, không phù hợp với đề bài là in từ nhỏ đến lớn.

3 Likes

push ec hoạt động thế nào v bạn ?

Đẩy giá trị của ecx vào stack.
Bạn phải đọc về stack, thanh ghi ebp và thanh ghi esp, và stdcall, và người ta dùng stack để lưu trữ biến cục bộ (local variable) như thế nào.

3 Likes

Tks bạn nhiều nhé ^^

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?