2014-07-04 33 views
0
DOSSEG 
    .MODEL SMALL 
    .STACK 100h 
    .DATA 

UserName db "Name: $" 
CLRF  db 10,13,"$" 
inputName db 24 dup ("$") 

CurYear db "Current Year: $" 
inputCurrentYear db 8 dup ("$") 

BirYear db "Birth Year: $" 
inputBirthYear db 8 dup ("$") 

outputName db "Hello, $" 

.code 
BEGIN: 
mov ax,@data 
mov ds,ax 
mov es,ax 

mov al,03h 
mov ah, 00h 
int 10h 

;username input 

NameInput: 
lea dx,UserName 
mov ah, 09h 
int 21h 

mov inputName,21 
lea dx,inputName 
mov ah,0ah 
int 21h 

lea dx,CLRF 
mov ah,09h 
int 21h 

;current year 

CurrentYear: 
lea dx,CurYear 
mov ah,09h 
int 21h 

mov inputCurrentYear,05 
lea dx,inputCurrentYear 
mov ah,0ah 
int 21h 

lea dx,CLRF 
mov ah,09h 
int 21h 

;birth year 

BirthYear: 
lea dx,BirYear 
mov ah,09h 
int 21h 

mov inputBirthYear,05 
lea dx,inputBirthYear 
mov ah,0ah 
int 21h 

lea dx,CLRF 
mov ah,09h 
int 21h 

;subtraction 

mov eax, inputCurrentYear 
mov ebx ,inputBirthYear 
sub eax,ebx 



Output: 
lea dx, outputName 
mov ah,09h 
int 21h 

lea dx, inputName 
mov ah,09h 
int 21h 

lea dx,CLRF 
mov ah,09h 
int 21h 

mov ah,4ch 
int 21h 
end BEGIN 

我需要帮助输入的诞生和当前的一年,因为我不知道如何将输出转换成十进制值与用户年龄计算器使用汇编语言

+0

数字的“值”将是相同的,无论其表示是十六进制还是二进制还是十进制。你可能想要的东西比“十进制值” –

回答

0

而且小数点ASCIIs的输入有进行计算转换。第一步是从所有的十进制ASCII码中减去30h,第二步是将十个数字系统的所有单个数字的完整值的数字相乘。示例中的第二个最低位必须乘以十,第三个最低位必须乘以100等等。最后,我们必须将所有值一起添加。现在我们可以使用这个值。

对于十进制输出,我们必须划分并将数字拆分为单独的数字,并且我们必须添加到所有30小时以将其转换为ASCII。例如,如果值是1995年的十进制数,那么我们必须将这个值除以十进制数1000来分隔最高的数字1.然后我们必须再次将该值除以100来分隔9,依此类推。

+0

我们没有“必须”,有更多优雅的方法,采用基数连续模除法。这些方法需要中间缓冲(因为字符串是“向后”生成的),但是这种缓冲可以在堆栈上完成,使用递归生成,以及在从递归回溯时输出。 –

+0

好吧,我们不必“不得不”,对于我不熟悉的词语感到抱歉,但无论如何,我们想要得到结果,如果存在不同的计算方法。 ...我个人更喜欢使用数据段来缓存值,因为数据段可以更容易访问,而不必关心子程序内部和外部的堆栈指针,而且地址可以简单地用自己的名字声明。 –

+0

不需要名称,也不需要明确的缓冲区空间分配,也不需要“关心”堆栈指针 - 在递归到转换时推送,在解绕时拉取和输出。数据段如何比简单地从栈中推入或拉出更容易访问?第一个被推动的项目将被最后拉动,最后被推动的项目被第一个拉动 - 结果是生成和输出字符之间的顺序颠倒 –