Assembly HELP! (nhanh với ạ)

Hồ Ngân Hương
(amazing)

Thành viên danh dự
nhanh với ạ

Ai xem hộ em nhầm nhọt chỗ nào, chạy thế quái nào cũng ra kết quả như nhau

bài toán : đọc một số nguyên 0<= x <= 255, kiểm tra xem nó có phải là một số hoàn thiện hay không (số hoàn thiện = tổng các ước số của nó, không kể chính nó)

VD: 6 = 3+2+1 => số hoàn thiện

;----------------------------------------------------------------

STACK SEGMENT STACK
DB 100H DUP('STACK')
STACK ENDS
;--------------------------------------------------------------------
DATA_SEG SEGMENT PUBLIC
MSG DB "Enter number (0 =< x <= 255):$"
MSG1 DB "a perfect number$"
MSG2 DB "not a perfect number$"
NUMBER_1 DB 0
SUM DB 0
TEMP_VAR DW 0
DATA_SEG ENDS
;--------------------------------------------------------------------
CODE_SEG SEGMENT PUBLIC
ASSUME CS:CODE_SEG, DS:DATA_SEG, SS: STACK
START: MOV AX,DATA_SEG
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MSG
INT 21H
CALL CR_LF

CALL GET_AN_INT_NUM
CMP Ax,255
JA EXIT
MOV NUMBER_1,AL
CALL CR_LF

MOV BX,2
DIV BX
MOV CX,AX ;cx = ax div 2

TOP: CALL CHECK
CMP BX,1
JNE NOTSUM
ADD SUM,CL
NOTSUM: ADD SUM,0
LOOP TOP

MOV AL,NUMBER_1
CMP AL,SUM
JE RIGHT
MOV AH,09H
LEA DX,MSG2
INT 21H
JMP EXIT

RIGHT: MOV AH,09H
LEA DX,MSG1
INT 21H
JMP EXIT
EXIT: MOV AH,4CH
INT 21H

CHECK PROC ; ckeck if Ax mod cx = 0 then bx = 1 elseif bx = 0
CMP CX,0
JE WRONG
XOR DX,DX
MOV AL,NUMBER_1
DIV CX
CMP DX,0
JNE WRONG
MOV BX,1
WRONG: MOV BX,0

CHECK ENDP


;---------------------------------------------------------------------------------------------
;This procedure get in an integer number between 0..255
;Return it to calling prog. in AX
;---------------------------------------------------------------------------------------------
GET_AN_INT_NUM PROC ;0 <= X <= 255
PUSH BX
PUSH CX
PUSH DX
XOR DX,DX
MOV TEMP_VAR,0
MOV CX,1 ;CX counts digits typed in
LOOP_2: CALL GET_A_DEC_DIGIT
CMP AL,0DH
JE EXIT_2
SUB AL,30H
XOR AH,AH
MOV DX,AX
MOV AX,TEMP_VAR
CMP CX,1
JE NOT_SUM_UP
MOV BL,10
MUL BL
NOT_SUM_UP:
ADD AX,DX
MOV TEMP_VAR,AX
INC CX
CMP CX,3
JA EXIT_2
JMP LOOP_2
EXIT_2:
MOV AX,TEMP_VAR
POP DX
POP CX
POP BX
RET
GET_AN_INT_NUM ENDP

CR_LF PROC NEAR
PUSH AX
PUSH DX
MOV AH,02
MOV DL,13
INT 21H
MOV DL,10
INT 21H
POP DX
POP AX
RET
CR_LF ENDP
;--------------------------------------------------------------------
;This procedure gets in a decimal digit between 0..9
;checks input for digit, Return it to calling prog. in AL
;--------------------------------------------------------------------
PUBLIC GET_A_DEC_DIGIT
GET_A_DEC_DIGIT PROC
PUSH DX
LOOP_1: MOV AH,08
INT 21H
CMP AL,0DH
JE EXIT_1
CMP AL,30H
JB LOOP_1
CMP AL,39H
JA LOOP_1
MOV DL,AL
MOV AH,02
INT 21H
EXIT_1: POP DX
RET
GET_A_DEC_DIGIT ENDP

CODE_SEG ENDS
END START
 
Chỉnh sửa lần cuối:
trời, chẳng hiểu gì cả.

Cái tên "nhanh với ạ" chẳng hiểu gì về nội dung,

đọc xong, càng thấy ... chẳng hiểu là em viết cái gì, bằng ngôn ngữ gì, cho môn gì, đọc hoa mắt luôn. sorry ko giúp được em rùi. Đổi cái tên đi, nếu nó là lập trình, cho sang bên CLB Tin học ấy, xem bác nào xem cho, chứ ở đây, ai biết nó là cái gì???
 
Assembly... Chưa hiểu em định hỏi cái gì, kết quả như nhau nghĩa là sao hả em? :D
 
:) ví dụ số 6 dễ thương kia check một hồi vẫn được báo kết quả là số rất không hoàn thiện :), 28 cũng là số hoàn thiện, nhưng vẫn được báo là không hoàn thiện :(.

to anh Hà: mai em thi rồi, sau ngày mai anh Hà chuyển hộ em vào thùng rác của admin
 
Re: nhanh với ạ

Hồ Ngân Hương đã viết:
Ai xem hộ em nhầm nhọt chỗ nào, chạy thế quái nào cũng ra kết quả như nhau

bài toán : đọc một số nguyên 0<= x <= 255, kiểm tra xem nó có phải là một số hoàn thiện hay không (số hoàn thiện = tổng các ước số của nó, không kể chính nó)

VD: 6 = 3+2+1 => số hoàn thiện

;----------------------------------------------------------------
...
START: MOV AX,DATA_SEG
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MSG
INT 21H
CALL CR_LF

CALL GET_AN_INT_NUM
CMP Ax,255
JA EXIT
MOV NUMBER_1,AL
CALL CR_LF

MOV BX,2
DIV BX
MOV CX,AX ;cx = ax div 2

TOP: CALL CHECK
CMP BX,1
JNE NOTSUM
ADD SUM,CL
NOTSUM: ADD SUM,0
LOOP TOP

MOV AL,NUMBER_1
CMP AL,SUM
JE RIGHT
MOV AH,09H
LEA DX,MSG2
INT 21H
JMP EXIT

RIGHT: MOV AH,09H
LEA DX,MSG1
INT 21H
JMP EXIT
EXIT: MOV AH,4CH
INT 21H

CHECK PROC ; ckeck if Ax mod cx = 0 then bx = 1 elseif bx = 0
CMP CX,0
JE WRONG
XOR DX,DX
MOV AL,NUMBER_1
DIV CX
CMP DX,0
JNE WRONG
MOV BX,1
WRONG: MOV BX,0

CHECK ENDP

...

Anh chỉ xem được đoạn thuật toán chính thôi, giả sử phần nhập liệu và kiểm tra là ổn rồi (tại máy tính ở đây không chạy được Assembly code).
Theo như anh hiểu thì đầu tiên em chọn CX = AX div 2, rồi cứ thế giảm dần CX và kiểm tra xem AX có chia hết cho CX hay không, nếu chia hết thì cộng thêm CX vào SUM. Như vậy đoạn code chính:

MOV BX,2
DIV BX
MOV CX,AX ;cx = ax div 2

TOP: CALL CHECK
CMP BX,1
JNE NOTSUM
ADD SUM,CL
NOTSUM: ADD SUM,0 ;Lệnh ADD SUM,0 thừa
LOOP TOP

MOV AL,NUMBER_1
CMP AL,SUM
JE RIGHT
MOV AH,09H
LEA DX,MSG2
INT 21H
JMP EXIT

RIGHT: MOV AH,09H
LEA DX,MSG1
INT 21H
JMP EXIT ;Lệnh thừa
EXIT: MOV AH,4CH
INT 21H

CHECK PROC ; ckeck if Ax mod cx = 0 then bx = 1 elseif bx = 0
CMP CX,0
JE WRONG
XOR DX,DX
MOV AL,NUMBER_1
DIV CX
CMP DX,0
JNE WRONG
MOV BX,1
WRONG: MOV BX,0

CHECK ENDP
...
có thể có lỗi sau:
-Anh không biết là sau khi gọi thủ tục CHECK, AX có bị thay đổi hay không, nếu có thì nên gán lại cho bằng NUMBER_1, nói chung cứ gán lại cho chắc (thậm chí nếu CX cũng bị thay đổi thì phải lưu ở đâu đó rồi khôi phục lại, cái này em xem giúp, anh không kiểm tra được :()
Như vậy đoạn code chính có thể như sau:

MOV BX,2
DIV BX
MOV CX,AX ;cx = ax div 2

TOP: CALL CHECK
CMP BX,1
JNE NOTSUM
ADD SUM,CL
NOTSUM:
MOV AL,NUMBER_1
XOR AH,AH
LOOP TOP

Chắc còn bugs chỗ khác nữa, kiểm tra nốt nhé :). Chúc thi tốt :beerchug:
 
Chỉnh sửa lần cuối:
Chào chị Ngân Hương.Hic.Chị sai ở proc Check.
1.Thủ tục mà chị k0 có ret---> treo la chết.
2.If ax mod cx =0 then bx =1 else bx=0 thì theo như bai chị viết thi lúc nào bx cũng =0.

CHECK PROC ; ckeck if Ax mod cx = 0 then bx = 1 elseif bx = 0
CMP CX,0
JE WRONG
XOR DX,DX
MOV AL,NUMBER_1
DIV CX
CMP DX,0
JNE WRONG
MOV BX,1
jmp @out
WRONG: MOV BX,0
@out:
ret
CHECK ENDP
Em đã sửa và chạy thử rồi,chắc la no vấn đề đâu.
Chúc mai chị thi tốt nhé.
 
chà chị Hương , em thấy em Hương nói đúng rồi ạ , nhưng mà phục chị thật , học cái này cơ ạ .............
Chà em Hương , không ngờ ..... biết em từ cách đây 3 năm mà đâu biết em giỏi đến không ngở ........... hà ...................
 
run sợ

Xuân Sơn tình cờ hôm nay chui vào mục Tin Học, sợ hãi giật mình thấy các kiều nữa HN AMS ngồi gõ code assembler lia lịa , đọc lồi mắt mà chẳng nhớ mấy thanh ghi đấy hoạt động thế nào...
Thật bái phục bái phục...
Mà này, mấy em xinh tươi thế, học cái ngành gỡ bàn phím làm gì cho chóng cận thì và hại da mặt....Sau này ế chồng thì tiền gì mua nổi một thằng đàn ông...
tình thân
anh Sơn
 
thanks Việt Hương cùng anh Nhật Minh và tất cả mọi người đã quan tâm. Em thi xong môn này rồi :) . Cảm ơn rất nhiều ạ!

Anh Xuân Sơn: đâu có học "gỡ" bàn phím để kiếm tiền mua đàn ông hả anh? Sao anh lại hạ thấp giá trị nam giới bằng giá cả như thế :).
 
em Hương ơi

em Hương chuyên Hóa giờ là chuyên tin học của anh ơi,
anh biết ngay mà, chuyên Hóa là tư duy thiếu logic lắm (j/k) không học được tin học đâu. Em thử đọc cái bài viết của anh xem, anh có mệnh đề quan hệ nào giữa việc học tin học để rồi nhan sắc tàn phai với việc học để có tiền mua chồng đâu.
Mà em nói thế nào, đàn ông cũng năm bảy loại , cũng như phụ nữ thôi em ạ (thôi, anh dừng ở đây nhé, kẻo dân tình lại chê anh ăn nói tục tằn...)
anh của em
Xuân Sơn
 
Back
Bên trên