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!
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é ^^