[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