汇编 相加后以十六进制输出?

来源:百度知道 编辑:UC知道 时间:2024/09/24 20:22:59
这个程序实现输入几个数之后相加,然后以十六进制输出,但有几个地方我疑惑不解:(1):lea di buf+2 这样不是少了buf+1单元没加吗?(2)mov cl buf+1貌似是赋初值,但累加的时候又没有用到?(3)mov ch,0这个语句有什么用?(4)mov dx,bx后面要输出什么?
另外还有一个问题(不是本题):在debug里我们电脑输入的时候是什么进制的?输出又是什么进制的?

拜托各位了!!

data segment
buf db 255,?,255 dup(?)
data ends
code segment
assume cs:code,ds:data
start proc far
begin:push ds
mov ax,0
push ax
mov ax,seg buf
mov ds,ax
mov dx,offset buf
lea bx,buf
mov ah,0Ah
int 21h
mov dl,0ah
mov ah,2
int 21h
lea di,buf+2
mov cl,buf+1
mov ch,0
xor bx,bx
again:mov al,[di]
sub al,30h
add bl,al
adc bh,0
inc di
loop again
mov ch,4
mov cl,4
rotate:rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah

1、buf db 255,?,255 dup(?) 。它的定义是这样子的。。lea di buf+2是第一个输入的数,buf+1是你输入的数的个数,这是系统自动赋给的。。
2、mov cl buf+1,这个是循环loop的控制,和下面的mov ch,0相结合,也就是说loop again ,是由cx来控制次数的,次数就是你输入的数字的个数。
3、ch,清零。使得cx=输入数字个数
4、mov dx,bx
mov ah,2
int 21h
ret
这一段是多余的,可以去掉,因为在这一段的前面有mov ah,4ch
int 21h
已经退出了。。
另外,用01h或者0ah号功能输入电脑都是认为是字符,存进电脑的是它的ASCII码。是以二进制形式存储的。。如果没有转换就输出,那输出的是ASCII码的对应字符。。需要转换。。
ps:debug的,不知道说得对不对,对debug还不是很清楚。。

1.8086cpu每个存储单元有多大?每个通用寄存器占多大空间?lea bx,buf这句啥意思?
2.在执行循环loop操作的时候,循环变量存储在哪里?cl和cx有啥关系?
3.这仅仅是为了保证cx=buf+1
4.dos中断处理程序int 21h,包含很多子程序,调用时通过对不同的寄存器赋值达到调用的效果

debug里你想输入什么进制都可以,默认为10进制,16进制后加h,2进制加b
输出默认为10进制

1楼又要带坏小朋友了 debug里默认什么都不加是十六进制 你加个h反而是报错的 另外输出只有一种形式 就是ascii码 而ascii码是你自己去转换的 根本和进制无关
(1)mov ah,0Ah
int 21h
这个中断是这样的,DS:DX=存放输入字符的起始地址
接受输入字符串缓冲区的定义说明:
1、第一个字节为缓冲区的最大容量,可认为是入口参数;
2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
3、从第三个字节开始存放实际输入的字符串;
所以要b