使用汇编语言打印字符串数组

时间:2012-10-23 20:05:54

标签: arrays assembly printing masm irvine32

我正在尝试将字符串添加到数组中以便以后从数组中打印,这就是我所拥有的。我错过了什么?

INCLUDE Irvine32.inc
.data
array dword 20 dup (0)
str1 byte 20 dup (0)
temp dword ?
n dword ?
count dword 0

mes1 db "press 1 to add an element, 2 to print, 3 to quit    ", 0

.code
main PROC

start:
    lea edx, mes1
    call writestring
    call readdec
    cmp eax, 1
    je add1
    cmp eax, 2
    je print2
    cmp eax, 3
    je stop

add1:
    call readin
    jmp done

print2:
    call print
    jmp done

done:
    jmp start

stop:
    exit

main ENDP

readin proc
    lea edx, str1
    mov ecx, sizeof str1
    call readstring

    mov ebx, count
    mov eax, [array]
    mov temp, eax
    add temp, ebx
    lea esi, temp
    mov ebx, [str1]
    mov [esi], ebx

readin endp

print proc
    mov esi, 0
    mov ecx, n

    @@do:
        mov eax, Array[esi]
        call writedec
        call crlf
        add esi, 4
        @@while: loop @@do

        ret
print endp
END main

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是创建一个包含行中以空字符结尾的字符串的字节数组。这不是一个"字符串数组"。成分:一个大缓冲区和一个指向该缓冲区有效部分末尾的指针。

(function (angular,namespace) {

    var marketplace = namespace.require('private.marketplace');

    angular.factory('blueStripeViewModelFactory', [
        '$http', function blueStripeViewModelFactory($http) {
            return new BlueStripeViewModel("id", 10);
        }
    ]);

    marketplace.blueStripeViewModelFactory = blueStripeViewModelFactory;

})(window.angular,window.namespace);

数组的元素通常具有相同的大小(上例中的 bytes )。因此,可以使用该索引对元素的位置进行索引并轻松计算。确定字节数组中某个字符串的位置并不容易。必须从头开始扫描数组以查找字符串终止的零(请查看块INCLUDE Irvine32.inc .DATA arrayptr DWORD OFFSET array array BYTE 4096 DUP (?) mes1 BYTE 10, "press 1 to add an element, 2 to print, 3 to quit ", 0 .CODE readin PROC mov edx, arrayptr ; Argument for ReadString: Pointer to memory mov ecx, 10 ; Argument for ReadString: maximal number of chars call ReadString ; Doesn't change EDX test eax, eax ; EAX == 0 (got no string) jz done ; Yes: don't store a new arrayptr lea edx, [edx+eax+1] ; EDX += EAX + 1 mov arrayptr, edx ; New pointer, points to the byte where the next string should begin done: ret readin ENDP print PROC lea edx, array ; Points to the first string L1: cmp edx, arrayptr ; Does it point beyond the strings? jae done ; Yes -> break call WriteString ; Doesn't change EDX call Crlf ; Doesn't change EDX scan_for_null: inc edx cmp BYTE PTR [edx], 0 ; Terminating null? jne scan_for_null ; no -> next character inc edx ; Pointer to next string jmp L1 done: ret print ENDP main PROC start: lea edx, mes1 call WriteString call ReadDec cmp eax, 1 je add1 cmp eax, 2 je print2 cmp eax, 3 je stop jmp next ; This was missing in the OP add1: call readin jmp next ; Just a better name than in the OP print2: call print jmp next ; Just a better name than in the OP next: ; Just a better name than in the OP jmp start stop: exit main ENDP END main )。 "字符串数组"实际上是一个指向字符串的指针数组:

scan_for_null