string - 在 8086 模拟器中取字符串长度和反向
问题描述
谁能帮我扭转这个字符串?
这是我的代码
include 'emu8086.inc'
PRINTN 'Enter length of string'
mov ah,1h
int 21h
printn
print "Enter String here: "
mov cl,al
sub cl,'0'
mov dl,cl
mov bx,0
p1:
mov ah,1h
int 21h
mov [bx],ax
inc bx
dec cl
cmp cl,0
jne p1
printn
PRINT 'inputted string : '
mov cl,dl
mov bx,0
output:
mov dl,[bx]
mov ah,2h
int 21h
inc bx
dec cl
cmp cl,0
jne output
printn
mov ax, 4c00h
int 21h
ret
解决方案
- 您将字符串存储在地址 0 (
mov bx, 0
)。根据您创建的程序类型,这可能会覆盖重要数据。在下面的示例程序中,我选择了 .COM 格式,您不必担心设置段寄存器。他们都是平等的。 - 存储字符串字符 (
mov [bx],ax
) 时,应使用AL
. 该字符仅在AL
寄存器中。 - 在序列
dec cl
cmp cl,0
jne p1
中,cmp cl, 0
是多余的,因为dec cl
指令已经提供了测试为零标志 ZF。并且知道这是一个带有 DOS 系统调用的输入循环,所以无论如何它很慢,你可以使用loop p1
. - 消息“输入的字符串:”并不能真正反映您所做的事情,是吗?也许写一些类似'反转字符串:'的东西?
- 就像@Peter Cordes 在评论中告诉你的那样,在p1输入循环结束时,
BX
寄存器指向字符串的最后一个字符。重复使用它,但以预先递减的方式进行。这与您在输入循环中使用的后递增方式相反。 - 输出循环也可以使用较小的
loop p2
指令,因为速度方面的瓶颈是 DOS 系统调用,无论如何它都很慢。
#make_COM#
include 'emu8086.inc'
ORG 100h
PRINTN 'Enter length of string'
mov ah, 01h
int 21h ; -> AL = "0" to "9"
sub al, '0'
mov dl, al
mov dh, 0 ; -> DX = 0 to 9
printn
print "Enter String here: "
mov bx, OFFSET Buffer
mov cx, dx
p1:
mov ah, 01h
int 21h
mov [bx], al
inc bx ; "post-increment"
loop p1
printn
PRINT 'reversed string : '
mov cx, dx
p2:
dec bx ; "pre-decrement"
mov dl, [bx]
mov ah, 02h
int 21h
loop p2
printn
mov ax, 4C00h
int 21h
Buffer db 10 dup(0)
推荐阅读
- android - 我去手机设置,修改了一个权限,如何让应用重启,回到MainActivity?
- vb.net - 按变量值打开表单
- windows - Windows 中是否有一个选项可以创建一个包含在 RAM 中的字节的文件?
- hibernate - Hibernate 是 JDBC 的包装器?
- javascript - 带有来自 php 文件的消息的弹出框
- php - 如何修复 odbc 中的“[Microsoft][ODBC SQL Server Driver][SQL Server]'�'附近的语法错误”错误?
- python - 如何在 Python 中使用正则表达式从 HTML 标签中提取 Facebook 页面 URL?
- json - 如何获取json对象中的键值并将其影响到同一个对象中?
- c - 在读取 proc 文件之前,内核模块不会打印到 dmesg
- angular - 使用选择选项时,Angular(单击)在 Chrome 上不起作用