如何使用汇编语言打印0,2,4,6,...

时间:2009-02-10 02:02:04

标签: algorithm assembly

我有一份来自我的作业的作业。系统组织。主题,不幸的是,当谈到汇编语言时,我有点新鲜。我应该编写一个程序,分别显示数字0,2,4,6,8,10。我该怎么做呢?

也许这会回答我的问题:(请反应)

.model small
.stack 100H
.data
.code

call proc

mov cx,5

mov dx,0
L1:
mov bx,2
add dx,bx
mov ah,02h
loop L1
int 21
endp

9 个答案:

答案 0 :(得分:5)

去看你的讲师和/或导师并征求意见。这就是他们的目的。你还没有给我们任何 near 足够的信息来帮助你。

这就是我认为你的ABCD程序应该是什么样子。我建议你用它作为基线试图制作一个0 2 4 ...版本。

    model  proc
    .stack 100H
    .data
    .call

    main   proc

    mov    cx,10     ; 10 loops only.
    mov    dx,40h    ; start dx at 'A' - 1.
L1:
    inc    dx        ; move to next character.

    mov    ah,02h    ; int 21,02 is print character.
    int    21h

    loop   L1        ; loop until cx is 0

    mov    ax,4c00h  ; int 21,4c is exit with al holding exit code.
    int    21

    endp

如果你至少要转换它,请发布代码,我们会批评你所做的事情。

如果你被教导的东西,它永远不会持续,但是,如果你学到了什么,它会永远存在(尽管有酒精添加的braincells: - )。

Int 21是DOS中断,允许汇编程序使用各种DOS函数。它在概念上是一个基于AH寄存器的巨大开关语句,这就是为什么你会看到像Int 21 Fn 02这样的东西,这意味着执行mov ah,2后跟int 21

Int 21 Fn 02将获取DL的内容并将其输出到屏幕。顺序如下:

mov ah,02h
mov dl,41h
int 21h

将输出'A'字符(0x41)。

同样,Int 21 Fn 4c将退出当前正在运行的进程。

答案 1 :(得分:4)

汇编语言是编程特定CPU(或体系结构)所需的数字机器代码和其他常量的符号表示。因此,Mac的汇编语言(最近的英特尔X86)与iPhone上的汇编语言不同 - ARM。

您的老师也可能期望您意识到您将使用的数字的二进制形式与您将用于显示到屏幕的ASCII格式之间的区别。

答案 2 :(得分:3)

你知道有不止一种“汇编语言”。

答案 3 :(得分:3)

我确信你的班级在这里给了你一些教育。 你可以编写足够的程序集来打印一个或两个数字吗? 你能用足够的代码来计算数字,即使你不能打印它们吗?

发布那么多代码,你可以在这里找到帮助。

否则,你要求其他人真正为你做功课。

答案 4 :(得分:2)

你可以完全像打印A,B,C,D等的程序那样做,除了不是从'A'开始,从'0开始;而不是每次增加1(从'A'到'B'),增加2(从'0'到'2')。

打印“0”,“2”,“4”,“6”和“8”后,您要打印的下一个数字是“10”。

要打印'10',您可以打印'1',然后打印'0'。或者,不是使用int 21(一次打印一个字符)调用ah=2,而是可以设置ah=9来打印字符串(将ds:dx设置为内存块其中包含“10$”。


后来你提出了以下解决方案并要求批评:

.model small
.stack 100H
.data
.code

main proc

call defineuser1
call defineuser2
mov cx,5

userdefine1 proc
L1:
mov dx,0
mov bx,2
add dx,bx
mov ah,02h
loop L1
int 21h
endp

userdefine2 proc
mov ah, 4ch
int 21h
userdefine2
endp

我的批评如下:

  • defineuser1不存在(我认为你的意思是userdefine1)

  • 设置cx需要在程序内部(而不是之前)

  • 调用int 21需要在循环内部(不在外部)

  • 您需要对“10”进行特殊处理,如上所述

  • '0'(ASCII字符/数字)和0(数字)之间存在差异...您需要打印字符/数字,而不是数字

  • 您需要学习测试代码(编写代码,使用调试器逐步调试并调试代码),最好在发布有关代码的问题之前。

答案 5 :(得分:0)

你会有一个从零开始的计数器并重复递增2,打印结果。

答案 6 :(得分:0)

.model small
.stack 100H
.code
.data
var2 DB "10$"
main proc
    mov cx,4
    mov ax,0
    mov dl,al
    add dl,30h
    mov ah,02h
    int 21h
    mov ax,0
    var1:
   add ax,2
   mov dl,al
   add dl,30h
   mov bx,ax
   mov ah,2h
   int 21h
   mov ax,bx
   loop var1
   mov ax,@data
   mov ds,ax
   mov dx,offset var2
   mov ah,09h
   int  21h
   main endp
end main    

我是计算机科学的新手,当我看到这个问题时,我只是想尝试一下。我已经做到了,这是代码

答案 7 :(得分:-2)

MOV AX, 0
MOV BX, 2

ADDLOOP:
ADD AX, BX
CMP AX, 10
JE DONE
JMP ADDLOOP

DONE:

确定。那是我最好的尝试。遗漏了很多细节。我还要提一下,我没有任何关于如何在屏幕上打印字符的线索。

与其他人提到的一样,你没有指定哪种汇编语言,所以我选择了x86。

最后,与你的导师谈谈,他们会比我们更多地帮助你。

答案 8 :(得分:-4)

您是否在输出中使用宏?

应该像......

 

        mov eax, 0

myloop: cmp eax, 10 jg done output macro eax add eax, 2 jmp myloop done:

当然是8086汇编。