【问题标题】:printing output in assembly x86汇编 x86 中的打印输出
【发布时间】: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


【解决方案1】:

为转换后的字符串添加一个 NULL 终止符。您可以在 convertDigit 循环之前执行此操作:

mov byte ptr [arry+4],0


顺便说一句,当您除以 2 的幂(如 16)时,您不需要 div。您可以使用更快的按位 AND 和移位指令:

mov dx,ax
and dx,15   ; dx = ax & 15 (== ax % 16)

shr ax,4    ; ax = ax >> 4 (== ax / 16)

【讨论】:

  • 啊,谢谢,我不允许对这个作业使用按位运算
  • 请问mov byte ptr [arry+4],0 是做什么的?它是否只读取到索引 4 的地址?
  • 在您的循环中,您从 si 设置为 4 开始,然后在存储任何字符之前将其预先递减(因此您将写入的最高地址是 arry+3)。所以这条新指令的作用是在最后一个数字之后放置一个 NULL 终止符,以便writeString 知道十六进制字符串的结束位置。
  • 您只为arry 保留一个字节,然后将4 个字符填入其中。让你的缓冲区更大! (可能是 5 个字节 - 保存终止 0)另外,在打印错误之后(如果发生这种情况),你会陷入 printSuccess - 可能不是你想要的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2010-11-21
相关资源
最近更新 更多