0

我正在使用emu8086。该程序旨在将小写句子转换为大写。

int 21h/09h表现得很奇怪,它只是删除了整行。我知道它应该输出存储在 dx 中的字符串,但在这里它的行为很奇怪。我不知道为什么在执行那部分代码时会发生这种情况。其余代码工作正常。谁能解释一下?如果问题不清楚,请告诉我,我会尽力解决。

mov ah,09h
mov dx,offset str
int 21h

这是完整的代码:

.model large
.data                                                            
str db 99,?,99 dup(?)
nl db 10d,13d,'$'
m1 db "Enter a sentence in lowercase: $"
m2 db "Your sentence in uppercase is: $"
.code

;//NEWLINE
newline proc
mov ah,09h
mov dx,offset nl
int 21h
ret
endp

main proc

;//MAIN CODING

mov ax,@data
mov ds,ax
mov es,ax

;//STRING INPUT
mov ah,09h
mov dx,offset m1
int 21h
mov ah,0Ah
mov dx,offset str
int 21h
CALL newline

;//CHARACTER COUNT
mov dx,offset str
mov bx,dx
mov ah,00h
mov al,[bx+1]
mov bp,ax
mov cx,ax

;//CONVERTING LOWERCASE INTO UPPERCASE
mov si,offset str
add si,2
mov bx,0000h
mov ax,0000h
repeat:
mov bl,[si]
mov al,bl
sub al,32d
xchg bl,al
mov [si],bl
inc si
loop repeat

;//PRINTING THE RESULT
mov ah,09h
mov dx,offset m2
int 21h 

;//PROBLEM OCCURS HERE
mov ah,09h                      ;THE PROBLEMATIC LINES
mov dx,offset str               ;THE PROBLEMATIC LINES
int 21h                         ;THE PROBLEMATIC LINES


;//ENDING THE PROGRAM
mov ah,4ch
int 21h

main endp
end main
4

3 回答 3

0

首先,让我们更改输入变量定义以使生活更轻松:

str db 99,?,99 dup(?)

更改为:

str      db 99, ?, 99 dup("$") 

为什么?DOS 中的字符串缓冲区以 $ 结尾,因此我们只需初始化填充为 $ 的缓冲区,因此我们不必在代码中添加 $。

接下来,文本不是从str地址开始,而是str + 2

Format of DOS input buffer:

Offset  Size    Description     (Table 01344)
00h    BYTE    maximum characters buffer can hold
01h    BYTE    (call) number of chars from last input which may be recalled
(ret) number of characters actually read, excluding CR
02h  N BYTEs   actual characters read, including the final carriage return

所以,第一个字节是缓冲区大小,不需要下一个字节,所以字符串实际上是从 2 个字节开始的!

如果缓冲区str地址从 300 开始,那么字符串的地址是 302,有意义吗?

;//PROBLEM OCCURS HERE  
mov     ah, 09h         
mov     dx, offset str+2 ; <---- this will print the string
int     21h             
于 2013-09-09T02:04:07.837 回答
0

谢谢芽。但这是我第二天设计的。它还免除了符号和数字的转换:P

.model large
.data                                                            
str dw 599,?,599 dup(?)
nl db 10d,13d,'$'
m1 db "Enter a sentence in lowercase: $"
m2 db "Your sentence in UPPERCASE is: $"
.code

;//ALL THE SUB-PROCEDURES

;//NEWLINE
newline proc
    mov ah,09h
    mov dx,offset nl
    int 21h
    ret
endp

main proc



;//MAIN CODING

    mov ax,@data
    mov ds,ax
    mov es,ax

    ;//STRING INPUT
    mov ah,09h
    mov dx,offset m1
    int 21h
    mov ah,0Ah
    mov dx,offset str
    int 21h
    CALL newline

    ;//PRINT PROMPT MESSAGE
    mov ah,09h
    mov dx,offset m2
    int 21h 

    ;//CHARACTER COUNT
    mov dx,offset str
    mov bx,dx
    mov ah,00h
    mov al,[bx+1]
    mov bp,ax
    mov cx,ax

    ;//CONVERTING LOWERCASE INTO UPPERCASE
    mov si,offset str
    add si,2
    mov bx,0000h
    mov ax,0000h
    repeat:
    mov bl,[si]
    mov al,bl

    ;//IF CHARACTER OTHER THAN LOWERCASE LETTER, PRINT IT AS IT IS
    mov bp,0061h ;ASCII 'a'
    cmp bx,bp
    JL notequal
    mov bp,007Ah ;ASCII 'z'
    cmp bx,bp
    JG notequal

    sub al,32d
    xchg bl,al

    ;//PRINTING OUTPUT CHARACTER BY CHARACTER
    notequal:
    mov ah,02h
    mov dl,bl
    int 21h
    inc si
    loop repeat

    ;//ENDING THE PROGRAM
    mov ah,4ch
    int 21h

main endp
end main
于 2013-09-12T20:55:57.153 回答
0

实际上 dup(?) 并不意味着用零填充,这意味着它没有被初始化,加载器可以在加载程序时用它想要的任何东西填充它,但是由于我们需要用“$”终止我们的字符串,我们将初始化它用它让我们的生活更轻松。

所以,当我改变这个时:

str db 99,?,99 dup(?)

对此:

str db 99,?,99 dup("$")

和这个:

mov ah,09h       
mov dx,offset str
int 21h  

对此:

mov ah,09h       
mov dx,offset str + 2
int 21h 

我们得到了正确的输出!

在此处输入图像描述

于 2013-09-10T01:13:46.137 回答