【问题标题】:ASCII string to asciiz (assembly 8086)ASCII 字符串到 asciiz(程序集 8086)
【发布时间】:2015-04-17 15:52:50
【问题描述】:

我正在使用汇编 8086 语言处理一些文件夹中断,我需要读取一个 ascii 字符串并将其转换为 asciz 字符串以指定一些参数。 - 如何在字符串末尾添加空字符? - 如果我用 ah=9 int 21h 读取字符串,它会添加回车符吗? 我真的需要帮助!感谢您的关注。

【问题讨论】:

  • ah = 9int 21h 写入 字符串到 STDOUT。它不读。有int 21h 函数可以一次读取一个字符,您可以这样做并在您看到回车之前计算它们。然后你就会知道长度。

标签: string assembly ascii dos x86-16


【解决方案1】:

通过中断 21h 服务 0AH(09H 用于显示)从键盘捕获字符串。捕获的字符串以 chr(13) 结尾。要显示此字符串,必须将 chr(13) 替换为 '$',或者,要将字符串用作文件名(例如,创建文件并写入文件),请将 chr(13) 替换为 chr(0) .

使用 0AH 捕获字符串需要三个 DB 的数据段中的变量,下图说明逻辑:

前两个字符用于控制(0AH 需要它们)。有用的字符串从位置 2(第三个字节)开始。

要找出结束 chr(13) 的位置,我们要做的就是将长度(第二个字节)加到第三个字节 capisci 上?

现在是代码。下一个小程序向用户显示一条消息并等待字符串,将 chr(13) 替换为 chr(0)(创建和 ASCIIZ 字符串),使用该字符串创建一个文件,将文本写入它并关闭它。注意数据段中的变量filename,三个DB:

.model small

.stack 100h

.data

handle   dw ? 

filename db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
         db  ?         ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
         db  26 dup(0) ;CHARACTERS ENTERED BY USER. END WITH CHR(13).

msj      db 'ENTER FILE NAME HERE: $' 

text     db 'text for file'  ;LENGTH = 13.

.code
;INITIALIZE DATA SEGMENT.
    mov ax, @data
    mov ds, ax

;DISPLAY MESSAGE.
    mov dx, offset msj
    mov ah, 9
    int 21h      

;CAPTURE FILENAME FROM KEYBOARD.                                    
    mov ah, 0Ah
    mov dx, offset filename ;THIS VARIABLE REQUIRES THE 3-DB FORMAT.
    int 21h                

;CAPTURED STRING ENDS WITH CHR(13), BUT TO CREATE FILE WE NEED
;THE FILENAME TO END WITH CHR(0), SO LET'S CHANGE IT.
    mov si, offset filename + 1 ;NUMBER OF CHARACTERS ENTERED.
    mov cl, [ si ] ;MOVE LENGTH TO CL.
    mov ch, 0      ;CLEAR CH TO USE CX. 
    inc cx         ;TO REACH CHR(13).
    add si, cx     ;NOW SI POINTS TO CHR(13).
    mov al, 0
    mov [ si ], al ;REPLACE CHR(13) BY 0.            

;CREATE FILE.
    mov ah, 3Ch
    mov cx, 0
    mov dx, offset filename + 2 ;CHARACTERS START AT BYTE 2.
    int 21h
    mov handle, ax  ;PRESERVE FILE HANDLER.

;WRITE SOME TEXT TO FILE.
    mov ah, 40h          
    mov bx, handle       ;THE FILE.       
    mov dx, offset text 
    mov cx, 13           ;LENGTH OF TEXT.
    int 21h

;CLOSE FILE
    mov ah, 3Eh   
    mov bx, handle
    int 21h

;END PROGRAM.
    mov ah, 4ch
    int 21h

差点忘了:变量文件名表示最大长度为 26,但我们预计为 25。最后 chr(13) 需要一个额外的字节。例如,如果要捕获 10 个字符,请将 11 指定为最大长度。

【讨论】:

  • 您好 Jose,感谢您的回答,但它不起作用,它甚至不显示“输入文件名”消息。我试图修复它,但结果不好,你能修复它吗?非常感谢
  • 它不显示字符串。它的作用是将 chr(13) 替换为 chr(0),打开文件,写入并关闭它。
  • 初始化数据段后,您的程序应该将一个字符串写入标准输出,但是当我运行它时没有输出,也没有创建任何文件。
  • 我正在使用 EMU8086 编译器。您使用的是什么编译器或 IDE?有个主意:从8086-microprocessor-emulator.soft32.com 下载 EMU8086,安装它,复制粘贴我的代码并运行它。在 EMU8086 中,使用该程序创建的文件保存在 EMU8086 目录内名为“MyBuild”的子目录中,源代码保存在“MySource”中(默认情况下,您可以更改它)。运行时,输入类似“test.txt”的名称。
  • 你说得对,我用的是dosbox,以后试试emu8086,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多