Tasm 指向数据的指针

Tasm pointer to data

我需要从输入字符串中一个一个地加载字符,但是我不能,因为我的指针似乎指向了错误的位置。本质上我最大的问题是我不知道如何制作像 mov dl, buffer+bl 这样的东西。这是代码:

.model small
.stack 200h

.data
buffer  db 16 dup(?)
p db ?  ;pointer

.code
pr1:

mov ax, @data
mov ds, ax

;read input
mov dx, offset buffer
mov ah, 0Ah
int 21h 

;cycle set up
mov bl, 02h
mov cl, buffer+01h  

;new line
mov ah, 02h
mov dl, 10
int 21h

;cycle for each symbol
ciklas:

    mov p, offset buffer
    add p, bl
    mov dl, [p]

    int 21h

    inc bl

loop ciklas 

mov ah, 4ch
mov al, 00h
int 21h

end pr1

我的程序应该重新打印输入,但它却打印了各种微笑

Int 21/AH=0Ah的缓冲区由三部分组成:size、length、string。大小是字符串的最大大小,必须初始化。

改变

buffer  db 16 dup(?)

buffer  db 16, 0, 16 dup(?)

考虑一下,字符串从 buffer + 2 开始。

偏移量大小为 16 字节。如果要将偏移量存储到 pp 必须具有相同的大小。

改变

p db ?  ;pointer

p dw ?  ;pointer

循环循环 CX。尽可能晚地初始化它。您不知道,如果对函数的调用 (int 21h) 会破坏它。如果你只能加载CL,你可以用xor ch, ch使CHCX的另一部分)无效。你不需要对 p 的错误大惊小怪,有一个处理器指令可以做到这一点(关键字:base plus index)。我的建议:

;cycle for each symbol
xor ch, ch
mov cl, buffer+01h
xor bx, bx                  ; BX = 0
ciklas:
    mov dl, [buffer + 2 + bx]
    mov ah, 02h
    int 21h
    inc bx
loop ciklas