在 Assembly x86 MASM 中连接字符串和数组的大小

Posted

技术标签:

【中文标题】在 Assembly x86 MASM 中连接字符串和数组的大小【英文标题】:Concatenating a string and the size of an array in Assembly x86 MASM 【发布时间】:2016-10-14 16:11:47 【问题描述】:

我能够遍历数组并打印出值。但是,我还想打印出字符串“我的数组的长度为 7”,其中 7 是数组中(元素的数量)的长度。但是,我不能将字符串与数组的长度连接起来。请帮忙。谢谢。

INCLUDE Irvine32.inc 
.data
    myarray byte 23, 2, 3, 40, 5, 16, 7
    x byte 5 
    l dword lengthof myarray 
    msg1 byte "The length of my array is ",0
    msg2 byte "-------------------------------",0
    i byte 0
    .code 
    main PROC 

        mov eax, 0
        mov esi, offset myarray;
        mov ecx, l 



        myloop:
        mov al, [esi]
        call writedec 
        call crlf 
        inc esi 
        mov edx, OFFSET msg1 
        mov edx, l

        loop myloop

        call writestring
        call crlf 
        call crlf

        exit 

        main ENDP
        end main

我得到的结果如下:

23
2
3
40
5
16
7

"esimovarray.asm has stopped working"

请帮忙。谢谢。

【问题讨论】:

在调试器中单步调试代码。观察寄存器值。暂时使用较短的数组来加快调试速度。 【参考方案1】:

我想我们只需要改变几行代码的顺序:

INCLUDE Irvine32.inc 
.data
    myarray byte 23, 2, 3, 40, 5, 16, 7
    x byte 5 
    l dword lengthof myarray 
    msg1 byte "The length of my array is ",0
    msg2 byte "-------------------------------",0
    i byte 0
    .code 
    main PROC 

        mov eax, 0
        mov esi, offset myarray;
        mov ecx, l 

        myloop:
        mov al, [esi]
        call writedec 
        call crlf 
        inc esi 
        ;mov edx, OFFSET msg1         ;◄■■■ NOT HERE.
        ;mov edx, l                   ;◄■■■ NOT HERE.
        loop myloop

        mov edx, OFFSET msg1          ;◄■■■ RIGHT HERE!
        call writestring

        mov eax, l                    ;◄■■■ RIGHT HERE! MUST BE EAX.
        call writedec

        exit 

        main ENDP
        end main

【讨论】:

以上是关于在 Assembly x86 MASM 中连接字符串和数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何将Assembly(irvine masm)中的字符串初始化回null?

MASM x86 如何打印多行字符串变量?

MASM Assembly 中的数组(非常困惑的初学者)

如何在 x86 程序集中按值传递结构

在 MASM 8086 程序集中读取多个文件

masm x86 程序集崩溃中的 DOS 中断