我第一次来这里。我是一名大学生。我使用汇编语言创建了一个简单的程序。我想知道我是否可以使用循环方法来运行它几乎与我发布的程序下面的内容相同。而我也渴望找到一些我可以通过MSN消息说话的人,所以我可以马上问你问题。(如果可能的话) 好的,谢谢你
.MODEL small
.STACK 400h
.data
prompt db 10,13,'Please enter a 3 digit number, example 100:',10,13,'$' ;10,13 cause to go to next line
first_digit db 0d
second_digit db 0d
third_digit db 0d
Not_prime db 10,13,'This number is not prime!',10,13,'$'
prime db 10,13,'This number is prime!',10,13,'$'
question db 10,13,'Do you want to contine Y/N $'
counter dw 0d
number dw 0d
half dw ?
.code
Start:
mov ax, @data ;establish access to the data segment
mov ds, ax
mov number, 0d
LetsRoll:
mov dx, offset prompt ; print the string (please enter a 3 digit...)
mov ah, 9h
int 21h ;execute
;read FIRST DIGIT
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov first_digit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, doubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
mov cx, 100d ;This is so we can calculate 100*1st digit +10*2nd digit + 3rd digit
mul cx ;start to accumulate the 3 digit number in the variable imul cx
;it is understood that the other operand is ax
;AND that the result will use both dx::ax
;but we understand that dx will contain only leading zeros
add number, ax ;save
;variable <number> now contains 1st digit * 10
;----------------------------------------------------------------------
;read SECOND DIGIT, multiply by 10 and add in
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov second_digit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, boubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
mov cx, 10d ;continue to accumulate the 3 digit number in the variable
mul cx ;it is understood that the other operand is ax, containing first digit
;AND that the result will use both dx::ax
;but we understand that dx will contain only leading zeros. Ignore them
add number, ax ;save -- nearly finished
;variable <number> now contains 1st digit * 100 + second digit * 10
;----------------------------------------------------------------------
;read THIRD DIGIT, add it in (no multiplication this time)
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov third_digit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, boubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
add number, ax ;Both my variable number and ax are 16 bits, so equal size
mov ax, number ;copy contents of number to ax
mov cx, 2h
div cx ;Divide by cx
mov half, ax ;copy the contents of ax to half
mov cx, 2h;
mov ax, number; ;copy numbers to ax
xor dx, dx ;flush dx
jmp prime_check ;jump to prime check
print_question:
mov dx, offset question ;print string (do you want to continue Y/N?)
mov ah, 9h
int 21h ;execute
mov ah, 1h
int 21h ;execute
cmp al, 4eh ;compare
je Exit ;jump to exit
cmp al, 6eh ;compare
je Exit ;jump to exit
cmp al, 59h ;compare
je Start ;jump to start
cmp al, 79h ;compare
je Start ;jump to start
prime_check:
div cx; ;Divide by cx
cmp dx, 0h ;reset the value of dx
je print_not_prime ;jump to not prime
xor dx, dx; ;flush dx
mov ax, number ;copy the contents of number to ax
cmp cx, half ;compare half with cx
je print_prime ;jump to print prime section
inc cx; ;increment cx by one
jmp prime_check ;repeat the prime check
print_prime:
mov dx, offset prime ;print string (this number is prime!)
mov ah, 9h
int 21h ;execute
jmp print_question ;jumps to question (do you want to continue Y/N?) this is for repeat
print_not_prime:
mov dx, offset Not_prime ;print string (this number is not prime!)
mov ah, 9h
int 21h ;execute
jmp print_question ;jumps to question (do you want to continue Y/N?) this is for repeat
Exit:
mov ah, 4ch
int 21h ;execute exit
END Start
答案 0 :(得分:1)
...你的意思是使用循环?你已经是。两次。
或者你的意思是使用LOOP指令?如果这是你的目标,我会说不要打扰。最后我听说,现在,大多数处理器的LOOP比等效的dec,compare和branch慢。除此之外,在你的情况下,1和0是特殊的(除以1将始终有效,抛弃你的逻辑,而0将导致错误),这使得你不值得你去LOOP。
答案 1 :(得分:0)
我不是汇编专家,但我认为你在汇编中循环的方式是finit(迭代):定义一个最大循环数并增加一个值来比较每次用je完成它。
条件循环是相同的,但不是增加数字,而是将预定义的值与另一个值进行比较,然后以je结束,这样它就会循环,直到达到你想要的为止。
我没有仔细查看你的代码,虽然我很匆忙,很抱歉,如果这不是你的意思。
编辑:当然你不必使用跳跃如果相等的指令,你也可以根据情况选择不相等或任何其他的。
编辑2:他忘了最基本的一个,只是跳回到循环的开始,进行无限循环。虽然你可能想要一些东西来打破它,所以它不常见:)