Assembly 基本输入汇编语言

Assembly 基本输入汇编语言,assembly,input,masm,Assembly,Input,Masm,嘿,我已经开始学习汇编语言了 我编写了以下代码: 我正在尝试输入,它是工作的一种,但当我尝试打印它,我没有得到正确的字符串。我用它来选择中断功能 我附加了一个屏幕截图,我已经输入了以下字符串: Hey this is me taking input 但我得到了意想不到的结果 截图: 问题: 我做错了什么? 在编写汇编程序时,有好的调试器可供使用吗? 有没有好的汇编教程的链接会很好? 谢谢。您没有为输入字符串留出足够的空间;当您声明MSG时,您只给它4个字符的空间Hey$ 注意:使用db Siz

嘿,我已经开始学习汇编语言了

我编写了以下代码:

我正在尝试输入,它是工作的一种,但当我尝试打印它,我没有得到正确的字符串。我用它来选择中断功能

我附加了一个屏幕截图,我已经输入了以下字符串:

Hey this is me taking input
但我得到了意想不到的结果

截图:

问题: 我做错了什么? 在编写汇编程序时,有好的调试器可供使用吗? 有没有好的汇编教程的链接会很好?
谢谢。

您没有为输入字符串留出足够的空间;当您声明MSG时,您只给它4个字符的空间Hey$

注意:使用db Size dup 0,我们可以占用大小字节数的值

.MODEL SMALL
.STACK 10H
Size = 3
.DATA
M1  db Size           ; First character=max length
M2  db ?              ; Second char of buffer=length of input
MSG db Size dup (20H) ; Rest of buffer=input string
    db 0DH            ; followed by carriage return (0Dh)
;---
    db "$"            ; (allways needed for printing function)
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX

MOV AH,0AH        ; setting the sub function
MOV DX, offset M1 ; moving address of input buffer
INT 21h           ; calling interrupt

MOV AH, 09
MOV DX, OFFSET MSG
INT 21h           ; for printing

MOV AH, 04CH      ; Select exit function
MOV AL, 00        ; Return 0
INT 21h           ; Call Interupt to Terminate program
MAIN ENDP
END MAIN

0a返回输入的缓冲区。字节0=缓冲区可容纳的最大字符数,字节1=上次输入的字符数,字节2+=实际字符数。您正在转储整个缓冲区,包括元数据字节。我如何分别通过0、字节1和字节2+访问?只需使用偏移量msg+2,basically@MarcB我正在使用偏移量msg+2,但仍然得到意外的结果。
.MODEL SMALL
.STACK 10H
Size = 3
.DATA
M1  db Size           ; First character=max length
M2  db ?              ; Second char of buffer=length of input
MSG db Size dup (20H) ; Rest of buffer=input string
    db 0DH            ; followed by carriage return (0Dh)
;---
    db "$"            ; (allways needed for printing function)
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX

MOV AH,0AH        ; setting the sub function
MOV DX, offset M1 ; moving address of input buffer
INT 21h           ; calling interrupt

MOV AH, 09
MOV DX, OFFSET MSG
INT 21h           ; for printing

MOV AH, 04CH      ; Select exit function
MOV AL, 00        ; Return 0
INT 21h           ; Call Interupt to Terminate program
MAIN ENDP
END MAIN