【问题标题】:Outputting numbers' ASCII character in Assembly 8086在程序集 8086 中输出数字的 ASCII 字符
【发布时间】:2016-04-15 02:21:32
【问题描述】:

我在斐波那契数列计算的每个步骤中输出计算值时遇到问题,它输出计算值的相应 ascii 字符,如 ☺ ☻ ♥ ♣ 序列应该运行多少次取决于用户,但它是限制为 47:

org 100h

ask_for_input db " Please enter a number[1-47]: ","$"
inputNumber DB 0  
conv DB 10D 
newL DB 0AH,"$"      


ask-again:        
    LEA DX, newL
    MOV AH,9H
    int 21H       

   ; Ask for user input       
   LEA DX, ask_For_input                       
   mov AH,9H
   int 21H             

   ; Gets user input
   ; First digit           
    MOV ah, 01H          
    int 21h

    SUB AL, 30H
    MUL conv   
    MOV inputNumber, AL

    ; Second Digit
    MOV AH, 01H 
    int 21h

    SUB AL, 30H
    add inputNumber, AL

    ; Checks if number is above 47D
    CMP inputNumber, 2FH
    JNLE ask-again  
    ; Checks if number is below 00D
    CMP inputNumber, 00H
    JLE ask-again    

; Squence loop Counter                      
MOV CH, 00H
MOV CL, inputNumber 

; Starting calculation
prev DB 01D   
current DB 1D            

Begin:
   space DB " ","$"
   LEA DX, space
   MOV AH,9H
   int 21H    

   ; Print Current Number                            
   LEA DX, current,"$" 
   mov AH,09H
   int 21H 

   ; Finds next number
   MOV BL, prev
   add current, BL 

   ; Advances prev
   MOV BL, current
   SUB BL, prev
   MOV prev, BL             

   Loop Begin

【问题讨论】:

  • 绝对不要将数据放在代码执行路径中。把它们放在所有代码之后。就打印而言,int 21h / ah=09h 用于打印字符串。因此,您必须将您的号码转换为字符串。已经有很多关于如何做到这一点的问题,所以请搜索一下。
  • LEA DX, current,"$" 应该做什么?那还能组装吗?
  • @Michael 我实际上是汇编新手,这是我所看到的导师刚刚给出的关于将字符串输出到控制台的教科书
  • @Michael 你不将数据放在代码执行路径中是什么意思?
  • 我的意思是混合代码和数据。 CPU 不知道区别,不会自动跳过数据。

标签: assembly ascii emu8086


【解决方案1】:
  • 始终将数据放在执行路径之外。现在您已经在指令之间放置了 prevcurrentspace 的数据。这将导致失败。

    ask_for_input db " Please enter a number[1-47]: ","$"
    inputNumber   DB 0  
    conv          DB 10D 
    newL          DB 0AH,"$"      
    prev          DB 01D   
    current       DB 01D,"$"            
    space         DB " ","$"
    
  • 为了实际打印数字,您需要将其转换为字符。您的 current 变量包含一个二进制值,而不是一个字符!此快速解决方案将仅显示单个数字斐波那契数:

    ; Print Current Number                            
    add current, 30H
    LEA DX, current
    mov AH,09H
    int 21H 
    sub current, 30H
    

【讨论】:

  • 感谢您的回答,但由于我们要求用户输入 1-47 之间的数字,因此结果肯定会超过 1 位
  • 这就是为什么我说你需要转换它。搜索转换例程。
  • 其实我自己也想出了一个转换方法,写完代码就贴出来
  • 另请注意,使用字节大小的变量将不允许使用这 47 个斐波那契数!为此,您需要使用双字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2021-06-26
  • 1970-01-01
  • 2014-01-16
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多