Assembly debug.exe出现问题

Assembly debug.exe出现问题,assembly,Assembly,我正在尝试使用windows中的调试工具来创建一个简单的程序。我想输入一个字符串,然后检查内存以查看保存的字符 以下是我的代码: mov bx,200 mov byte [bx],33 ;; Set maximum string length (32 + Ent) mov ah, 0Ah int 21h 每次我组装代码并运行它时,它都允许我输入字符串,然后调试自动退出。这是我第一次使用它,所以我不确定问题出在哪里 如有任何帮助/提示,将不胜感激 谢谢 函数0Ah需要DS:DX中的缓

我正在尝试使用windows中的调试工具来创建一个简单的程序。我想输入一个字符串,然后检查内存以查看保存的字符

以下是我的代码:

mov  bx,200
mov  byte [bx],33   ;; Set maximum string length (32 + Ent)
mov  ah, 0Ah
int  21h
每次我组装代码并运行它时,它都允许我输入字符串,然后调试自动退出。这是我第一次使用它,所以我不确定问题出在哪里

如有任何帮助/提示,将不胜感激


谢谢

函数0Ah需要DS:DX中的缓冲区地址,您的代码只设置BX,而不设置DX

下面是我如何键入代码的:

C:\>debug
-a 100
13DB:0100 mov bx, 200
13DB:0103 mov byte [bx], 33
13DB:0106 mov ah, 0a
13DB:0108 mov dx, bx
13DB:010A int 21
13DB:010C
以下是我得到的:

-u 100
13DB:0100 BB0002        MOV     BX,0200
13DB:0103 C60733        MOV     BYTE PTR [BX],33
13DB:0106 B40A          MOV     AH,0A
13DB:0108 89DA          MOV     DX,BX
13DB:010A CD21          INT     21
以下是寄存器中的内容:

-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0100   NV UP EI PL NZ NA PO NC
13DB:0100 BB0002        MOV     BX,0200
接下来,我只使用“继续”命令逐条执行代码指令:

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0100   NV UP EI PL NZ NA PO NC
13DB:0100 BB0002        MOV     BX,0200
-p

AX=0000  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0103   NV UP EI PL NZ NA PO NC
13DB:0103 C60733        MOV     BYTE PTR [BX],33                   DS:0200=33
-p

AX=0000  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0106   NV UP EI PL NZ NA PO NC
13DB:0106 B40A          MOV     AH,0A
-p

AX=0A00  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0108   NV UP EI PL NZ NA PO NC
13DB:0108 89DA          MOV     DX,BX
-p

AX=0A00  BX=0200  CX=0000  DX=0200  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=010A   NV UP EI PL NZ NA PO NC
13DB:010A CD21          INT     21
-p
然后输入“QWE”,然后输入:

QWE
AX=0A0D  BX=0200  CX=0000  DX=0200  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=010C   NV UP EI PL NZ NA PO NC
13DB:010C 0000          ADD     [BX+SI],AL                         DS:0200=33
-
完成了。这是在记忆中:

-d 200
13DB:0200  33 03 51 57 45 0D 00 00-00 00 00 00 00 00 00 00   3.QWE...........
13DB:0210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13DB:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

函数0Ah需要DS:DX中的缓冲区地址,您的代码只设置BX,而不设置DX

下面是我如何键入代码的:

C:\>debug
-a 100
13DB:0100 mov bx, 200
13DB:0103 mov byte [bx], 33
13DB:0106 mov ah, 0a
13DB:0108 mov dx, bx
13DB:010A int 21
13DB:010C
以下是我得到的:

-u 100
13DB:0100 BB0002        MOV     BX,0200
13DB:0103 C60733        MOV     BYTE PTR [BX],33
13DB:0106 B40A          MOV     AH,0A
13DB:0108 89DA          MOV     DX,BX
13DB:010A CD21          INT     21
以下是寄存器中的内容:

-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0100   NV UP EI PL NZ NA PO NC
13DB:0100 BB0002        MOV     BX,0200
接下来,我只使用“继续”命令逐条执行代码指令:

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0100   NV UP EI PL NZ NA PO NC
13DB:0100 BB0002        MOV     BX,0200
-p

AX=0000  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0103   NV UP EI PL NZ NA PO NC
13DB:0103 C60733        MOV     BYTE PTR [BX],33                   DS:0200=33
-p

AX=0000  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0106   NV UP EI PL NZ NA PO NC
13DB:0106 B40A          MOV     AH,0A
-p

AX=0A00  BX=0200  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=0108   NV UP EI PL NZ NA PO NC
13DB:0108 89DA          MOV     DX,BX
-p

AX=0A00  BX=0200  CX=0000  DX=0200  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=010A   NV UP EI PL NZ NA PO NC
13DB:010A CD21          INT     21
-p
然后输入“QWE”,然后输入:

QWE
AX=0A0D  BX=0200  CX=0000  DX=0200  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13DB  ES=13DB  SS=13DB  CS=13DB  IP=010C   NV UP EI PL NZ NA PO NC
13DB:010C 0000          ADD     [BX+SI],AL                         DS:0200=33
-
完成了。这是在记忆中:

-d 200
13DB:0200  33 03 51 57 45 0D 00 00-00 00 00 00 00 00 00 00   3.QWE...........
13DB:0210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13DB:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

您希望程序从int 21返回后执行什么?您希望程序从int 21返回后执行什么?顺便说一句,您可以在程序末尾添加int3指令(断点指令)。这样,如果您只使用“go”命令,int3将立即停止执行,并将控制权转移回调试器。更好的解决方案。。。DOS程序通常应通过调用函数4Ch结束,如果在其末尾有“mov ax,4c00”和“int 21”,则“go”将执行该程序直到此处,并使其将控制返回给调试器,并显示一条消息“程序正常终止”。完美!非常感谢你!int21h,函数4Ch是.EXE的官方版本,但int20h对于.COM是可以接受的(它被定义为)。另一个选项是只使用RET。它将返回的地址在PSP中,并包含一个close via Int方法。:-)顺便说一句,您可以在程序末尾添加一条int3指令(断点指令)。这样,如果您只使用“go”命令,int3将立即停止执行,并将控制权转移回调试器。更好的解决方案。。。DOS程序通常应通过调用函数4Ch结束,如果在其末尾有“mov ax,4c00”和“int 21”,则“go”将执行该程序直到此处,并使其将控制返回给调试器,并显示一条消息“程序正常终止”。完美!非常感谢你!int21h,函数4Ch是.EXE的官方版本,但int20h对于.COM是可以接受的(它被定义为)。另一个选项是只使用RET。它将返回的地址在PSP中,并包含一个close via Int方法。:-)