汇编除以零溢出
Assembly divide by zero overflow
对 8086 装配还很陌生,我遇到了一个我似乎无法弄清楚的错误..
当第 4 位数字(例如 123X)为 0 或 1 时,div 过程(也许之前还有其他东西)给我错误,错误是 Divide 为零,它也不总是与其他数字一起使用..
我需要做的是输入 4 位数字,确保输入正确,取 4 位数字的总和和 divide 数字与 4 位数字的总和,如果没有余数就是Harshad数,之后需要检查特殊情况,4位数字的翻转和是否也有效。
例如数字1729,和为19,翻转为91,都可以divided,1729无余。
这是我的代码...抱歉,如果它太长...
; Harshad.asm - check if input from user (4 digits, 1000-9999) is a Harshad number and if so, check if it's a "special" Harshad number
;
.MODEL SMALL
.STACK 100h
.DATA
RequestStr DB 'Enter a 4 digit number (1000-9999):',13,10,'$'
IsHarshad DB ' is a Harshad number.$',13,10
SpecialHarshad DB 13,10,'It is also a special Harshad number.',13,10,'$'
NotHarshad DB ' is not a Harshad number$',13,10
IncorrectInput DB 13,10,'Input is incorrect.',13,10,'$'
Num DW ? ;Will fit a "word" size (16 bits)
DigitSum DB ? ;Sum of digits (maximum 9*4) fits a "byte" size (8 bits)
TEN DB 10
Temp DB ? ;Used to check if number is also special Harshad
;
.CODE
MOV AX,@DATA ;DS can be written to only through a register
MOV DS,AX ;Set DS to point to data segment
MOV AH,9 ;Set print option for INT 21h
MOV DX,OFFSET RequestStr ;Set DS:DX to point to RequestString
INT 21h ;Print RequestStr
;
NumberInput:
;First digit
MOV AH,1 ;Set scanning (input) option for INT 21h
INT 21h ;Scan first digit
SUB AL,'0' ;Converting from ascii value to numeral value
CMP AL,1 ;First digit must be between 1 and 9 in order for the number to be of 4 digits
JB WrongInput ;Otherwise jump to WrongInput label
CMP AL,9
JA WrongInput
MOV DigitSum,AL ;Store only first digit's value at the variable DigitSum
MOV AH,0 ;Set AH to zero so it won't affect the answer
MUL TEN ;multiply AX by 10
MOV Num,AX
;Second digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AL ;Add only second's digit value to DigitSum
ADD Num,AX ;Add AX's value (which has been multiplied by 10 with the first digit) to Num variable
MOV AX,0
MOV AX ,Num ;Move new Num's value to AX to multiply it by 10
MUL TEN
MOV Num,AX
;Third digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
ADD DigitSum,AL
MOV AH,0
ADD Num,AX
MOV AX,0
MOV AX,Num
MUL TEN
MOV Num,AX
;Forth digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
ADD DigitSum,AL ;Now DigitSum contains the sum of each of the 4 digits in the number
MOV AH,0
ADD Num,AX ;Num contains full 4 digits number
JMP CheckHarshad
WrongInput:
MOV AH,9
MOV DX,OFFSET IncorrectInput
INT 21h
JMP CodeEnd
CheckHarshad:
MOV AX,0
MOV AX,Num
DIV DigitSum ;Number will be stored in AL and the remainder in AH
CMP AH,0 ;Check if there is remainder or not
JE CheckSpecialHarshad
MOV AH,9
MOV DX,OFFSET NotHarshad
INT 21h
JMP CodeEnd
CheckSpecialHarshad:
MOV AH,9
MOV DX, OFFSET IsHarshad
INT 21h
MOV AX,0
MOV AL,DigitSum
DIV TEN
MOV Temp,AL
MOV DigitSum,AH
MOV AX,0
MOV AL,DigitSum
MUL TEN
ADD AL,Temp
MOV DigitSum,AL ;DigitSum now has it's former number flipped
MOV AX,0
MOV AX,Num
DIV DigitSum
CMP AH,0
JNE CodeEnd
MOV DX,OFFSET SpecialHarshad
MOV AH,9
INT 21h
CodeEnd:
MOV AH,4Ch
INT 21h
END
在@Jester 的帮助下,我更改了一些值,这是最终结果(一个汇编代码,检查 4 位数字是否是 Harshad 数字,如果是,还要检查它是否是特殊的 Harshad 数字) :
; Harshad.asm - check if input from user (4 digits, 1000-9999) is a Harshad number and if so, check if it's a "special" Harshad number
;
.MODEL SMALL
.STACK 100h
.DATA
RequestStr DB 'Enter a 4 digit number (1000-9999):',13,10,'$'
IsHarshad DB ' is a Harshad number.',13,10,'$'
SpecialHarshad DB 'It is also a special Harshad number.',13,10,'$'
NotHarshad DB ' is not a Harshad number',13,10,'$'
IncorrectInput DB 13,10,'Input is incorrect.',13,10,'$'
Num DW ? ;Will fit a "word" size (16 bits)
DigitSum DW ? ;Sum of digits
TEN DW 10
TENbyte DB 10
Temp DB ? ;Used to check if number is also special Harshad during the div process
Temp2 DB ? ;Used with special Harshad div process
;
.CODE
MOV AX,@DATA ;DS can be written to only through a register
MOV DS,AX ;Set DS to point to data segment
MOV AH,9 ;Set print option for INT 21h
MOV DX,OFFSET RequestStr ;Set DS:DX to point to RequestString
INT 21h ;Print RequestStr
;
NumberInput:
;First digit
MOV AH,1 ;Set scanning (input) option for INT 21h
INT 21h ;Scan first digit
MOV DX,0
SUB AL,'0' ;Converting from ascii value to numeral value
CMP AL,1 ;First digit must be between 1 and 9 in order for the number to be of 4 digits
JB WrongInput ;Otherwise jump to WrongInput label
CMP AL,9
JA WrongInput
MOV AH,0
MOV DigitSum,AX ;Store only first digit's value at the variable DigitSum
MUL TEN ;Multiply AX by 10
MOV Num,AX
;Second digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AX ;Add only second's digit value to DigitSum
ADD Num,AX ;Add AX's value (which has been multiplied by 10 with the first digit) to Num variable
MOV AX,0
MOV AX,Num ;Move new Num's value to AX to multiply it by 10
MUL TEN
MOV Num,AX
;Third digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AX
ADD Num,AX
MOV AX,0
MOV AX,Num
MUL TEN
MOV Num,AX
;Forth digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AX ;Now DigitSum contains the sum of each of the 4 digits in the number
ADD Num,AX ;Num contains full 4 digits number
JMP CheckHarshad
WrongInput:
MOV AH,9
MOV DX,OFFSET IncorrectInput
INT 21h
JMP CodeEnd
CheckHarshad:
MOV AX,0
MOV DX,0
MOV AX,Num
DIV DigitSum ;Number will be stored in AX and the remainder in DX
CMP DX,0 ;Check if there is remainder or not
JE CheckSpecialHarshad
MOV AH,9
MOV DX,OFFSET NotHarshad
INT 21h
JMP CodeEnd
CheckSpecialHarshad:
MOV AH,9
MOV DX, OFFSET IsHarshad
INT 21h
MOV AX,0
MOV AX,DigitSum
DIV TENbyte
MOV Temp,AL
MOV Temp2,AH
MOV AX,0
MOV AL,Temp2
MUL TENbyte
ADD AL,Temp
MOV Temp2,AL ;Temp2 now has the DigitSum number flipped
MOV AX,0
MOV AX,Num
DIV Temp2
CMP AH,0
JNE CodeEnd
MOV DX,OFFSET SpecialHarshad
MOV AH,9
INT 21h
CodeEnd:
MOV AH,4Ch
INT 21h
END
对 8086 装配还很陌生,我遇到了一个我似乎无法弄清楚的错误..
当第 4 位数字(例如 123X)为 0 或 1 时,div 过程(也许之前还有其他东西)给我错误,错误是 Divide 为零,它也不总是与其他数字一起使用..
我需要做的是输入 4 位数字,确保输入正确,取 4 位数字的总和和 divide 数字与 4 位数字的总和,如果没有余数就是Harshad数,之后需要检查特殊情况,4位数字的翻转和是否也有效。
例如数字1729,和为19,翻转为91,都可以divided,1729无余。 这是我的代码...抱歉,如果它太长...
; Harshad.asm - check if input from user (4 digits, 1000-9999) is a Harshad number and if so, check if it's a "special" Harshad number
;
.MODEL SMALL
.STACK 100h
.DATA
RequestStr DB 'Enter a 4 digit number (1000-9999):',13,10,'$'
IsHarshad DB ' is a Harshad number.$',13,10
SpecialHarshad DB 13,10,'It is also a special Harshad number.',13,10,'$'
NotHarshad DB ' is not a Harshad number$',13,10
IncorrectInput DB 13,10,'Input is incorrect.',13,10,'$'
Num DW ? ;Will fit a "word" size (16 bits)
DigitSum DB ? ;Sum of digits (maximum 9*4) fits a "byte" size (8 bits)
TEN DB 10
Temp DB ? ;Used to check if number is also special Harshad
;
.CODE
MOV AX,@DATA ;DS can be written to only through a register
MOV DS,AX ;Set DS to point to data segment
MOV AH,9 ;Set print option for INT 21h
MOV DX,OFFSET RequestStr ;Set DS:DX to point to RequestString
INT 21h ;Print RequestStr
;
NumberInput:
;First digit
MOV AH,1 ;Set scanning (input) option for INT 21h
INT 21h ;Scan first digit
SUB AL,'0' ;Converting from ascii value to numeral value
CMP AL,1 ;First digit must be between 1 and 9 in order for the number to be of 4 digits
JB WrongInput ;Otherwise jump to WrongInput label
CMP AL,9
JA WrongInput
MOV DigitSum,AL ;Store only first digit's value at the variable DigitSum
MOV AH,0 ;Set AH to zero so it won't affect the answer
MUL TEN ;multiply AX by 10
MOV Num,AX
;Second digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AL ;Add only second's digit value to DigitSum
ADD Num,AX ;Add AX's value (which has been multiplied by 10 with the first digit) to Num variable
MOV AX,0
MOV AX ,Num ;Move new Num's value to AX to multiply it by 10
MUL TEN
MOV Num,AX
;Third digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
ADD DigitSum,AL
MOV AH,0
ADD Num,AX
MOV AX,0
MOV AX,Num
MUL TEN
MOV Num,AX
;Forth digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
ADD DigitSum,AL ;Now DigitSum contains the sum of each of the 4 digits in the number
MOV AH,0
ADD Num,AX ;Num contains full 4 digits number
JMP CheckHarshad
WrongInput:
MOV AH,9
MOV DX,OFFSET IncorrectInput
INT 21h
JMP CodeEnd
CheckHarshad:
MOV AX,0
MOV AX,Num
DIV DigitSum ;Number will be stored in AL and the remainder in AH
CMP AH,0 ;Check if there is remainder or not
JE CheckSpecialHarshad
MOV AH,9
MOV DX,OFFSET NotHarshad
INT 21h
JMP CodeEnd
CheckSpecialHarshad:
MOV AH,9
MOV DX, OFFSET IsHarshad
INT 21h
MOV AX,0
MOV AL,DigitSum
DIV TEN
MOV Temp,AL
MOV DigitSum,AH
MOV AX,0
MOV AL,DigitSum
MUL TEN
ADD AL,Temp
MOV DigitSum,AL ;DigitSum now has it's former number flipped
MOV AX,0
MOV AX,Num
DIV DigitSum
CMP AH,0
JNE CodeEnd
MOV DX,OFFSET SpecialHarshad
MOV AH,9
INT 21h
CodeEnd:
MOV AH,4Ch
INT 21h
END
在@Jester 的帮助下,我更改了一些值,这是最终结果(一个汇编代码,检查 4 位数字是否是 Harshad 数字,如果是,还要检查它是否是特殊的 Harshad 数字) :
; Harshad.asm - check if input from user (4 digits, 1000-9999) is a Harshad number and if so, check if it's a "special" Harshad number
;
.MODEL SMALL
.STACK 100h
.DATA
RequestStr DB 'Enter a 4 digit number (1000-9999):',13,10,'$'
IsHarshad DB ' is a Harshad number.',13,10,'$'
SpecialHarshad DB 'It is also a special Harshad number.',13,10,'$'
NotHarshad DB ' is not a Harshad number',13,10,'$'
IncorrectInput DB 13,10,'Input is incorrect.',13,10,'$'
Num DW ? ;Will fit a "word" size (16 bits)
DigitSum DW ? ;Sum of digits
TEN DW 10
TENbyte DB 10
Temp DB ? ;Used to check if number is also special Harshad during the div process
Temp2 DB ? ;Used with special Harshad div process
;
.CODE
MOV AX,@DATA ;DS can be written to only through a register
MOV DS,AX ;Set DS to point to data segment
MOV AH,9 ;Set print option for INT 21h
MOV DX,OFFSET RequestStr ;Set DS:DX to point to RequestString
INT 21h ;Print RequestStr
;
NumberInput:
;First digit
MOV AH,1 ;Set scanning (input) option for INT 21h
INT 21h ;Scan first digit
MOV DX,0
SUB AL,'0' ;Converting from ascii value to numeral value
CMP AL,1 ;First digit must be between 1 and 9 in order for the number to be of 4 digits
JB WrongInput ;Otherwise jump to WrongInput label
CMP AL,9
JA WrongInput
MOV AH,0
MOV DigitSum,AX ;Store only first digit's value at the variable DigitSum
MUL TEN ;Multiply AX by 10
MOV Num,AX
;Second digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AX ;Add only second's digit value to DigitSum
ADD Num,AX ;Add AX's value (which has been multiplied by 10 with the first digit) to Num variable
MOV AX,0
MOV AX,Num ;Move new Num's value to AX to multiply it by 10
MUL TEN
MOV Num,AX
;Third digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AX
ADD Num,AX
MOV AX,0
MOV AX,Num
MUL TEN
MOV Num,AX
;Forth digit
MOV AX,0
MOV AH,1
INT 21h
SUB AL,'0'
CMP AL,0
JB WrongInput
CMP AL,9
JA WrongInput
MOV AH,0
ADD DigitSum,AX ;Now DigitSum contains the sum of each of the 4 digits in the number
ADD Num,AX ;Num contains full 4 digits number
JMP CheckHarshad
WrongInput:
MOV AH,9
MOV DX,OFFSET IncorrectInput
INT 21h
JMP CodeEnd
CheckHarshad:
MOV AX,0
MOV DX,0
MOV AX,Num
DIV DigitSum ;Number will be stored in AX and the remainder in DX
CMP DX,0 ;Check if there is remainder or not
JE CheckSpecialHarshad
MOV AH,9
MOV DX,OFFSET NotHarshad
INT 21h
JMP CodeEnd
CheckSpecialHarshad:
MOV AH,9
MOV DX, OFFSET IsHarshad
INT 21h
MOV AX,0
MOV AX,DigitSum
DIV TENbyte
MOV Temp,AL
MOV Temp2,AH
MOV AX,0
MOV AL,Temp2
MUL TENbyte
ADD AL,Temp
MOV Temp2,AL ;Temp2 now has the DigitSum number flipped
MOV AX,0
MOV AX,Num
DIV Temp2
CMP AH,0
JNE CodeEnd
MOV DX,OFFSET SpecialHarshad
MOV AH,9
INT 21h
CodeEnd:
MOV AH,4Ch
INT 21h
END