如何修复x86 turbo汇编语言的输出

问题描述 投票:0回答:2
DOSSEG
    .MODEL SMALL
    .STACK 100h
    .DATA

UserName db "Name: $"
CLRF     db 10,13,"$"
inputName db 24 dup ("$")

CurYear db "Current Year: $"
inputCurrentYear dw 8 dup ("$")

BirYear   db "Birth Year: $"
inputBirthYear dw 8 dup ("$")   

outputName db "Hello, $"

outputAge db "Your age is $"

currentYearH1 db "$"
currentYearH2 db "$"

birthYearH1 db "$"
birthYearH2 db "$"

answer1 dw "$"
answer2 dw "$"

.code

BEGIN:

;open bracket

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

mov al,03h
mov ah, 00h
int 10h

lea dx,CLRF
mov ah,09h
int 21h

;username input

NameInput:
lea dx,UserName
mov ah, 09h
int 21h

mov inputName,21
lea dx,inputName
mov ah,0ah
int 21h

lea dx,CLRF
mov ah,09h
int 21h

;current year

CurrentYear:
lea dx,CurYear
mov ah,09h
int 21h

mov inputCurrentYear,05
lea dx,inputCurrentYear
;mov ax,dx
mov ah,0ah
int 21h

mov ax,inputCurrentYear
sub ax,3030h
xchg ah,al
aad
mov currentYearH1, al
mov ax,inputCurrentYear[4]
sub ax,3030h
xchg ah,al
aad
mov currentYearH2, al

lea dx,CLRF
mov ah,09h
int 21h

;birth year

BirthYear:
lea dx,BirYear
mov ah,09h
int 21h

mov inputBirthYear,05
lea dx,inputBirthYear
;mov bx,dx
mov ah,0ah
int 21h

mov ax, inputBirthYear[2]
sub ax,3030h
xchg ah,al
aad
mov birthYearH1,al
mov ax,inputBirthYear[4]
sub ax,3030h
xchg ah,al
aad 
mov birthYearH2,al

lea dx,CLRF
mov ah,09h
int 21h

;lea dx,inputBirthYear
;mov ah,09h
;int 21h

lea dx,CLRF
mov ah,09h
int 21h

;subtraction

;lea ax,inputCurrentYear

;lea dx,inputBirthYear

;sub ax,dx
;mov [SI],ax
;lea dx,[SI]
;mov ah,09h
int 21h
;sub ax,3030h

Output:
lea dx, outputName
mov ah,09h
int 21h

lea dx, inputName
mov ah,09h
int 21h

lea dx,CLRF
mov ah,09h
int 21h

;lea ax,inputCurrentYear

;lea dx,inputBirthYear

;sub ax,dx
;mov difference,ax

lea dx,outputAge
mov ah,09h
int 21h

lea dx,CLRF
mov ah,09h
int 21h

lea dx,CLRF
mov ah,09h
int 21h

mov al,birthYearH2
sub currentYearH2,al

mov al,birthYearH1
sub currentYearH1,al

mov al,currentYearH2
aam
add ax,3030h
xchg ah,al
mov answer2,ax

mov al,currentYearH1
aam
add ax,3030h
xchg ah,al
mov answer1,ax

lea dx, answer1
mov ah,09h
int 21h

lea dx,answer2
mov ah,09h
int 21h

lea dx,CLRF
mov ah,09h
int 21h

mov ah,4ch
int 21h    

end BEGIN

当我运行此代码时,输​​出中出现随机符号,我想“清理”我的输出。

assembly x86 dos tasm
2个回答
2
投票

Int 21h/0Ah期望指向结构的指针,而不是指向字符串的指针。该结构的第一个字节必须由您填充字符串的最大长度。第二个字节将由具有输入字符串实际长度的函数填充。字符串不会以int 21h/09h所需的'$'结尾,而是以0Dh结尾。所以你需要改变那个角色。

我只针对inputName更正了问题。剩下的由你决定。

    ...
    mov inputName,21
    lea dx,inputName
    mov ah,0ah
    int 21h

    ; change 0Dh to '$'
    xor bh,bh
    mov bl, [inputName+1]             ; length of string
    mov byte [inputName+2+bx], '$'    ; store end-of-string-character 

    ...

    lea dx, outputName
    mov ah,09h
    int 21h

    lea dx, [inputName+2]             ; pointer to string
    mov ah,09h
    int 21h

    ...

0
投票

注意:DOS输入缓冲区+ 2的格式包含读取的实际字符,包括最终的回车符。

RBIL->inter61b.zip->INTERRUP.F
--------D-210A-------------------------------
INT 21 - DOS 1+ - BUFFERED INPUT
AH = 0Ah
DS:DX -> buffer (see #01344)
Return: buffer filled with user input
Notes:  ^C/^Break are checked, and INT 23 is called if either detected
reads from standard input, which may be redirected under DOS 2+
if the maximum buffer size (see #01344) is set to 00h, this call returns
  immediately without reading any input
SeeAlso: AH=0Ch,INT 2F/AX=4810h

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
--------K-210A00-----------------------------
© www.soinside.com 2019 - 2024. All rights reserved.