[Assembly] Nhập và xuất số nguyên
Trong Asm chỉ cung cấp các hàm nhập 1 chuỗi và nhập ký tự và muốn nhập 1 số có 2 chữ số trở lên cần phải xây dựng thủ tục riêng.
Thuật toán nhập số:
Tổng = 0 Nhập một chữ số ASCII từ bàn phím Repeat Đổi ký tự vừa nhập thành giá trị số (GTS) Tổng = tổng*10 + GTS Nhập tiếp ký tự số Until nhập ký tự Enter
Ví dụ mô tả thuật toán: Chẳng hạn chúng ta nhập số 123. Quá trình như sau:
Tổng = 0
Nhập ‘1’
Đổi ‘1’ → số 1
Tổng = 10*0 + 1
Nhập ‘2’
Đổi ‘2’ → số 2
Tổng = 10*1 + 2 = 12
Nhập ‘3’
Đổi ‘3’ → số 3
Tổng = 10*12 + 3 = 123
Thuật toán xuất số:
Giả sử trong AX có số 24168
chia 24168/10 được 2416 dư 8 chia 2416/10 được 241 dư 6 chia 241/10 được 24 dư 1 chia 24/10 được 2 dư 4 chia 2/10 được 0 dư 2 Viết ngược được 24168 Từ đây ta có thuật toán: đếm = 0 Repaet Chia số bị chia cho 10 Cất số dư vào ngăn xếp đếm = đếm +1 Until thương số = 0 For đếm do Lấy chữ số từ ngăn xếp Đổi ra ký tự Đưa ra màn hình End for
Code dưới đây gồm 2 hàm nhập số và xuất số nguyên từ -32768 đến 32767
.model small
.stack 100
.data
CLRF db 13, 10, '$'
.code
main proc
mov ax, @data
mov ds, ax
call inputDec
push ax ; luu Ax lai
mov ah, 9 ; xuong dong
lea dx, CLRF
int 21h
; lay Ax ra
pop ax
call outputDec
mov ah, 4ch
int 21h
main endp
inputDec proc
; Vao: nhap vao so
; Ra: So luu trong Ax
push bx
push cx
push dx
batDau:
mov ah, 2
xor bx, bx
xor cx, cx
mov ah, 1
int 21h
cmp al, '-'
je dauTru
cmp al, '+'
je dauCong
jmp tiepTuc
dauTru:
mov cx, 1
dauCong:
int 21h
tiepTuc:
cmp al, '0'
jnge khongPhaiSo ; khong lop hon hoac bang
cmp al, '9'
jnle khongPhaiSo ; Khong nho hon hoac bang
and ax, 000fh ; doi thanh chu so
push ax ; cat vao ngan xep
mov ax, 10
mul bx ; ax = tong*10
mov bx, ax
pop ax
add bx, ax ; tong = tong*10 + so
mov ah, 1
int 21h
cmp al, 13 ; da enter chua?
jne tiepTuc ; nhap tiep
mov ax, bx ; chuyen KQ ra ax
or cx, cx ; co phai so am khong
je ra
neg ax ; neu la so am thi doi ax ra so am
ra:
pop dx
pop cx
pop bx
ret
khongPhaiSo:
mov ah, 2
mov dl, 0dh
int 21h
mov dl, 0ah
int 21
jmp batDau
inputDec endp
outputDec proc
push bx
push cx
push dx
cmp ax, 0 ; neu ax > 0 tuc la khong phai so am ta doi ra day
jge doiRaDay
push ax
mov dl, '-'
mov ah, 2
int 21h
pop ax
neg ax ; ax = -ax
doiRaDay:
xor cx, cx ; gan cx = 0
mov bx, 10 ; so chia la 10
chia:
xor dx, dx ; gan dx = 0
div bx ; ax = ax / bx; dx = ax % bx
push dx
inc cx
cmp ax, 0 ; kiem tra xem thuong bang khong chua?
jne chia ; neu khong bang thi lai chia
mov ah, 2
hien:
pop dx
or dl, 30h
int 21h
loop hien
pop dx
pop cx
pop bx
;pop ax
ret
outputDec endp
end main



Hình như chỗ tieptuc mov ax,10 phải là mov bx,10 rồi ms mul bx đúng ko ạ
Nhập a và b là số có 3 chữ số thì thêm hàm như nào ạ?
Có 3 chữ số thì bạn giới hạn nhập 3 ký tự là được.