首页 文章

以8086汇编语言存储和检索内存中的数字

提问于
浏览
0

我是8086汇编语言的初学者 . 我想先尝试一些简单的东西 . 如何写一个程序,输入一个数字,说 x ,将它存储在内存中,然后再加载到寄存器中,然后显示它?

我做了这样的事情:

.MODEL SMALL

.DATA
    NL2     DB      0AH,0DH,'Enter a number:','$'
.CODE
MAIN PROC
    MOV si, 100d
    LEA DX,NL2 ; 
    MOV AH,09H  ; 
    INT 21H
    MOV AH,0AH  ; Read into buffer
    MOV [si],0AH ; Store in memory
    MOV BX,[si] ; load from memory to bx
    MOV BX, 09H ; display it
    INT 21H
   .EXIT

    MAIN    ENDP
            END     MAIN

怎么了?请帮我!谢谢!

4 回答

  • -1

    上面的代码有两个错误

    • $ 符号必须在引号中,否则可以生成错误 .

    • 在输入后,我们必须在 dlal 的值 al ,以在屏幕上打印输入的值 .

  • 0

    代码中有一些错误 . 要使用DOS函数0Ah(BUFFERED INPUT)输入字符串,我们必须使用输入缓冲区 . 此DOS输入缓冲区的格式如下所示(表01344) .

    Ralph Browns x86 / MSDOS中断列表:
    http://www.pobox.com/~ralf/files.html
    ftp://ftp.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/

    RBIL->inter61b.zip->INTERRUP.F
    --------D-2109-------------------------------
    INT 21 - DOS 1+ - WRITE STRING TO STANDARD OUTPUT
            AH = 09h
        DS:DX -> '$'-terminated string
    Return: AL = 24h (the '$' terminating the string, despite official docs which
            state that nothing is returned) (at least DOS 2.1-7.0 and NWDOS)
    Notes:  ^C/^Break are checked, and INT 23 is called if either pressed
        standard output is always the screen under DOS 1.x, but may be
          redirected under DOS 2+
        under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
    SeeAlso: AH=02h,AH=06h"OUTPUT"
    --------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 ret
    

    为了使用DOS函数09h显示ASCII字符串(来自用户输入),我们必须将缓冲区2的偏移地址输入DX,另外我们必须在调用函数之前在字符串后面放置一个“$” . 可以通过添加上次输入的字符数来计算在字符串后存储“$”的地址 .

    BUFFER DB 1, ?, " ", 0Dh, "$" ; Input buffer (only for one ASCII)
    
    mov bh, 0                     ; clear high byte of BX
    lea si, BUFFER+1              ; get the offset address+1 of the buffer
    mov bl, [si]                  ; get the number of byte from the last input
    mov BYTE PTR[si+bx+1], "$"    ; store "$" after the end of the string+CR
    

    如果输入的字节数大于1,则上面的示例更有意义,因此用户可能没有将最大数量的ASCII填充到缓冲区中,因此我们不知道字符串的结尾,所以我们必须从最后一个输入中获取ASCII数 . (但总而言之,我们必须确保缓冲区的尺寸足够大 . )

    lea dx, BUFFER+2
    mov ah, 9
    int 21h
    

    短剑

  • 0
    ; multi-segment executable file template.
    
    data segment
        ; add your data here!
        pkey db "press any key...$"
    ends
    
    stack segment
        dw   128  dup(0)
    ends
    
    code segment
    start:
    ; set segment registers:
        mov ax, data
        mov ds, ax
        mov es, ax
    
        ; add your code here
        mov cx,4
        input:
        mov ah,1
        int 21h
        push ax
        loop input 
    
        mov dx,13d
        mov ah,2
        int 21h
    
        mov dx,10d
        mov ah,2
        int 21h
    
        mov cx,4  
    
        output:
        pop bx
        mov dl,bl
        mov ah,2
        int 21h
        loop output
    
        exit:        
        lea dx, pkey
        mov ah, 9
        int 21h        ; output string at ds:dx
    
        ; wait for any key....    
        mov ah, 1
        int 21h
    
        mov ax, 4c00h ; exit to operating system.
        int 21h    
    ends
    
    end start ; set entry point and stop the assembler.
    

    这是8086编译器中堆栈的一个例子 . 谢谢

  • 0
    .model small
    .stack 32h
    .data 
    Message db " enter a no:" ,'$'
    .code
    Mov ax,@data
    Mov ds,ax
    Mov dx,offset message; display message
    Mov ah,01h; enter no
    Int 21h
    Mov dl,al
    Mov ah,02h; print no on screen
    Int 21h
    Mov ah,4ch
    Int 21h
    End
    

相关问题