ASCII 字符串转 asciiz(汇编 8086)
ASCII string to asciiz (assembly 8086)
我正在使用汇编 8086 语言处理一些文件夹中断,我需要读取 ascii 字符串并将其转换为 asciz 字符串以指定一些参数。
- 如何在字符串末尾添加空字符?
- 如果我用 ah=9 int 21h 读取字符串,它会添加回车 return 字符吗?
我真的需要帮助!感谢关注
使用中断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 作为最大长度。
我正在使用汇编 8086 语言处理一些文件夹中断,我需要读取 ascii 字符串并将其转换为 asciz 字符串以指定一些参数。 - 如何在字符串末尾添加空字符? - 如果我用 ah=9 int 21h 读取字符串,它会添加回车 return 字符吗? 我真的需要帮助!感谢关注
使用中断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 作为最大长度。