注册 登录
编程论坛 汇编论坛

关于如何在DOS里面得到汇编程序的运行结果!求教

wj13370336 发布于 2012-11-22 21:34, 2895 次点击
题目是:输入4位十进制输出为16进制!
11 回复
#2
有容就大2012-11-22 22:01
有思路和部分代码也行啊。。。

#3
一个孩子2012-11-22 22:38
好抽象~~
#4
hu9jj2012-11-23 08:50
解题的思路大致如下:

调用键盘中断接收用户输入的按键信息,若出现非数字信息则给予提示,出现回车键则表示数据录入结束,出现空格键或ESC键则结束程序。
将收到的十进制数据存放到指定的内存单元中。
若用户输入回车键则开始对存入内存单元的十进制数据进行转换,将转换后的十六进制数据存入在另一指定的内存单元中。
调用中断将十六进制数据显示出来。
#5
wj133703362012-11-24 11:34
回复 4楼 hu9jj
其实我知道程序,只是不知道怎么在DOS里面得到结果!
#6
wj133703362012-11-24 11:35
回复 2楼 有容就大
如果有结果那就更好了!
#7
L137812228452012-11-24 11:50
h
#8
hu9jj2012-11-24 19:36
以下是引用wj13370336在2012-11-24 11:34:17的发言:

其实我知道程序,只是不知道怎么在DOS里面得到结果!
把运算结果存放到指定的内存中,然后将指定内存的内容按要求输出到屏幕上,这通常是dos下显示结果的一种方式。
#9
wp2319572012-11-24 20:12
使用汇编编译器 把一个纯文本文件 变成一个。exe文件 然后再dos模式下  直接运行即可
#10
爱末流2012-11-28 16:13
回复 4楼 hu9jj
若用户输入回车键则开始对存入内存单元的十进制数据进行转换,将转换后的十六进制数据存入在另一指定的内存单元中。
 调用中断将十六进制数据显示出来。

我觉得很困难,当你有中断接受用户输入的时候,那么接受的都是字符串的ASCII码,当你输入1000的时候,缓冲区存放的都是ASCII码。
那么你要转换16进制显示的话,那么就得先转换成整形 然后存放到 寄存器或变量中, 至于将缓冲区的字符串转换整形不难,
难的是,比如 你输入 1000  ASCII =  31 30 30 30      转换存放到 ax   
ax = 1000 了    这个问题就出现。  用户按理是接受输入是按10进制的,但是成了 16进制的 1000 了
这下你还要将ax的1000按 十进制转换 后 还得保存起来啊,   (这是我自己问的啊。我也想知道) 但问题是我该如何把 ax=1000的值 看成 10进制的1000 然后再转换成16进制在存放回去啊?  

我写过 类似的程序,转换问题不难。        貌似没有那个中断可以接受整形数据的输入吧?
#11
hu9jj2012-11-28 16:27
很久没有实际接触汇编程序了,好象DOS中断有接收数据输入的入口,但不能肯定。调用BIOS中断接收键盘输入的键码,然后进行分析判断和处理这应该不存在问题,是可以做到的。
#12
爱末流2012-11-28 16:32
data    segmentstr   
 db      0ah,0dh
num     db      4 dup(?),'H$'
tab     db      '0123456789ABCDEF'
data    ends

code    segment
  assume  cs:code,ds:data
  begin:  mov     ax,data
  mov     ds,ax  ;初始化代码段
  xor     bx,bx
  mov     cx,10  ;进制
  next:   mov     ah,1      
  int     21h        
  cmp     al,0dh
   jz      conv  ;如果是回车,表示输入结束,转换开始
   push    ax  ;保存输入值,当然还有AH,因为堆栈的存取必须以字为单位
   mov     ax,bx
  mul     cx
 mov     bx,ax  ;将先前的结果向上推一位
pop     ax  ;取回本次输入
and     al,0fh  ;屏蔽掉无用位,类SUB AL,30H
xor     ah,ah  ;高位归零
add     bx,ax  ;合并本次输入
jmp     next
conv:   mov     ax,bx  ;开始转换
 mov     ch,4
 lea     bx,tab  ;没有见这个直接定址表起什么用啊!!!
mov     cl,4
lea     si,num
lopa:   rol     ax,cl  ;把高4位移到低4位  
push    ax
and     ax,000fh ;取出低4位
mov     [si],al  ;按地址由低到高的顺序将结果由高到底存放
inc     si
pop     ax
dec     ch      
 jnz     lopa      
 lea     dx,str
 mov     ah,9      
  int     21h  ;回车换行   
  mov     ah,4ch      
 int     21h
code    ends
end     begin



;算法描述:
;总体来说是以二进制为中介,
;先将输入视为十进制,转换为二进制数保存在BX中
;然后再将这个二进制数转换为十六进制数保存在num开始的单元中
;十进制转换为二进制的过程:
;初始化:假设第一次输入前的输入为0
;对于每次输入,将前面输入的各位均提升一位,即百位变千位,十位变百位,个位变十位,然后当前的输入填到个位,重复该步操作直到遇到回车符

;二进制转换为十六进制:
;因为每4个二进制位可以由1个十六进制位表示,所以依次取出4个二进制位就可以
;①每次循环移动4位,将高4位移动到低4位后,取出低4位
;②将取出的数依次写入num开始的单元中
;③重复①-②4次
;输出时:(这段代码没有,所以我说,没有见直接定址表起什么用)
;从num开始以字节为单位取数
;以得到的数字为偏移量,查表tab,得到对应的十六进制字符,输出,重复4次
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

网上别人写的



1