【发布时间】:2013-05-21 01:37:25
【问题描述】:
我有这个代码:
INCLUDE Irvine32.inc
.data
arry BYTE ?
prompt1 BYTE "Enter first hex number: ",0
prompt2 BYTE "Enter second hex number: ",0
prompt3 BYTE "The sum is ",0
prompt4 BYTE "The sum is out of range ",0
prompt5 BYTE "Convert again? [y/n]: ",0
prompt6 BYTE "First number is invalid ",0
prompt7 BYTE "Second number is invalid ",0
.code
main PROC
ReadInput:
L1:
mov edx, OFFSET prompt1
call writeString
mov edx, 0
call readHex
call Crlf
mov ecx, eax
jmp L3
L2:
mov eax, 0
mov edx, OFFSET prompt2
call writeString
mov edx, 0
call readHex
call Crlf
mov ebx, eax
mov eax, 0
jmp L4
L3:
cmp ecx, 0FFFFh
JA L5
JBE L2
L4:
cmp ebx, 0FFFFh
JA L6
JBE addInt
L5:
mov edx, OFFSET prompt6
call writeString
mov edx, 0
call Crlf
jmp L1
L6:
mov edx, OFFSET prompt7
call writeString
mov edx, 0
call Crlf
jmp L2
addInt:
clc
mov ax, cx
add ax, bx
JC printError
jmp convert
; convert hex to string
convert:
mov ecx, 0
mov esi, 0
mov si, 4
mov cx, 10h
convertDigit:
dec si
mov dx , 0
div cx
cmp dx, 9h
JA convertLetter
add dx, 30h
jmp printSucess
convertLetter:
add dx, 37h
jmp printSucess
printError:
mov edx, OFFSET prompt4
call writeString
call Crlf
printSucess:
mov arry[si], dl
cmp ax , 0
JNE convertDigit
mov edx, OFFSET arry
add dx, si
call writeString
call Crlf
exit
main ENDP
END main
当我尝试打印输出时,我得到了这个
输入第一个十六进制数:ff
输入第二个十六进制数:ff
1FEer 第一个十六进制数: 按任意键继续 。 . .
如你所见,prompt1的一部分er first hex number卡在了sum的值1FE,为什么会这样
程序循环edx寄存器3次第一次是E,第二次是F,第三次是1,然后到writeString打印输出,好像是什么程序假设在做,此时edx值突然跳转到00405911,为什么会这样?
提前感谢您的帮助
【问题讨论】:
-
复制prompt1 toedx时edx的地址和复制sum到edx时edx的地址一样,导致sum要追加替换prompt1的一部分,如何让edx改变到不同的地址,它只会输出没有添加提示1部分的总和?
-
缺少代码。
-
不,我没有复制粘贴所有内容
-
arry的地址是00405910,提示输入第一个十六进制数时edx的地址是00405911,当我将esi为1添加到edx时,edx的地址变为00405911 导致输出显示为1FEer first hex number:,而不是我想要的 1FE。如何更改 edx 地址以使输出不包含 prompt1 字符串?
标签: loops assembly x86 masm irvine32