【问题标题】:how to fix the output for x86 turbo assembly language如何修复 x86 turbo 汇编语言的输出
【发布时间】:2014-07-18 02:45:22
【问题描述】:
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

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

【问题讨论】:

  • 举例说明您正在使用的输入、收到的输出以及您希望纠正的输出有什么问题,这可能会对您有所帮助。
  • 输入只是一个字符串,它会指向姓名、当前年份和出生年份。输出是正确的,但名称输出前有一些奇怪的符号,年龄输出后有很多符号
  • @user3803626,如果您需要帮助,请提供建议的示例。

标签: assembly x86 dos tasm


【解决方案1】:

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

    ...

【讨论】:

    【解决方案2】:

    注意: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-----------------------------
    

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多