首页 > 解决方案 > 在汇编语言中得到错误的结果

问题描述

   org 100h 
.model small
.data 
 var db ?
 msg db 10,13,'$' 

.code      
; add your code here
main proc
     mov ax,@data
     mov ds,ax

     mov ah,1 ;input 1st number
     int 21h
     sub al,48    
     mov var,al

     mov ah,1   ;input 2nd number
     int 21h
     sub al,48

     MUL var    ; multiplying two numbers
  
     sub al,48 ; going to ASCII value

     mov dl,al
     mov ah,2    ; printing result
     int 21h
      
     mov ah,4ch   
     int 21h
main endp
     end main
     ret

标签: assemblyx86-16emu8086

解决方案


您错误地将两个程序模型混合在一起。对于MZ 可执行DOS 程序,省略第一个org 100h和最后一个ret. 或者使用更简单的COM 可执行文件,它不使用段切换指令.data,. code,并且您不必为段寄存器而烦恼。它的骨架看起来像

     .model TINY
     org 100h
main proc
     ; Program code must start here at offset 100h
     ; The first machine instruction.
     ; Put your code here.

     ret      ; A simple ret terminates the COM program.
var db ?      ; Data variables follow the code section.
msg db 10,13,'$' 
    end main

当您将两个数字与 相乘时mul var,乘积在寄存器中AX,它可能在 0..65535 范围内。仅在特殊情况下,例如 2 乘 3 的结果,您将得到结果 AX=6,可以通过将 48 加到它(不是通过减法)转换为一位数的结果。

有关如何将无符号 16 位整数转换为十进制数字的方法,请搜索此站点,这里有很多示例。


推荐阅读