标题:关于如何在DOS里面得到汇编程序的运行结果!求教
只看楼主
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
很久没有实际接触汇编程序了,好象DOS中断有接收数据输入的入口,但不能肯定。调用BIOS中断接收键盘输入的键码,然后进行分析判断和处理这应该不存在问题,是可以做到的。

活到老,学到老! http://www. E-mail:hu-jj@
2012-11-28 16:27
爱末流
Rank: 2
等 级:论坛游民
帖 子:101
专家分:16
注 册:2011-6-3
得分:0 
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次
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

网上别人写的



2012-11-28 16:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-387993-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 2.105038 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved