[英]How can I write an interpreter for 'eq' for Hack Assembly language?
[英]How do I print 0,2,4,6,… in assembly language?
我有一份作业要交。 系统组织 主题,不幸的是,我在汇编语言方面还是个新手。 我应该写一个程序,分别显示数字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
去拜访您的讲师和/或导师,并寻求建议。 那就是他们在那里的目的。 你还没有给我们任何接近足够的信息来帮助你。
我认为这是您的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
当您至少可以转换此代码时,请发布代码,我们将对您的工作进行评论。
如果您学到了什么,它永远不会长久,但是,如果您学到一些东西,它就会永远长久(尽管酒精会滋生脑细胞:-)。
Int 21
是DOS中断,它允许汇编程序使用各种DOS函数。 从概念上讲,这是一个基于AH
寄存器的巨大switch语句,这就是为什么您会看到类似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
将退出当前运行的进程。
汇编语言是数字机器代码和对特定CPU(或体系结构)进行编程所需的其他常量的符号表示。 因此,Mac(最近是Intel X86)的Mac汇编语言不同于iPhone上的汇编语言-ARM。
您的老师也可能希望您认识到要使用的数字的二进制形式和用于显示在屏幕上的ASCII格式之间的区别。
您确实知道“汇编语言”有多种风味。
我确定您的班级在这里给了您一些教育。 您可以编码足够的程序集来打印一个或两个数字吗? 即使无法打印,您是否可以编写足够的代码来计算数字?
发布那么多代码,您可能会在这里找到帮助。
否则,您是在要求别人为您做功课。
您可以像打印A,B,C,D等的程序一样执行此操作:除了不是从“ A”开始,而是从“ 0”开始; 而不是每次增加1(从“ A”到“ B”),而增加2(从“ 0”到“ 2”)。
打印“ 0”,“ 2”,“ 4”,“ 6”和“ 8”后,要打印的下一个数字是“ 10”。
要打印“ 10”,可以先打印“ 1”,再打印“ 0”。 或者,您可以将ah=9
设置为打印一个字符串(将ds:dx
设置为包含“ 10$
”的内存块),而不是使用ah=2
调用int 21
(一次打印一个字符)。
稍后,您提出了以下解决方案并提出批评:
.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
(数字)之间有区别...您需要打印字符/数字,而不是数字
您需要学习测试代码(编写代码,使用调试器逐步调试并调试),最好是在发布有关代码的问题之前。
您将有一个从零开始的计数器,然后将其重复递增2,以打印结果。
.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
我是计算机科学的新手,当我看到这个问题时,我只是想尝试一下。 我已经做到了,这是代码
MOV AX, 0
MOV BX, 2
ADDLOOP:
ADD AX, BX
CMP AX, 10
JE DONE
JMP ADDLOOP
DONE:
好。 那是我最好的尝试。 很多细节遗漏了。 我还应该提到,我不知道如何在屏幕上打印字符。
就像其他人提到的那样,您没有指定哪种汇编语言,所以我选择了x86。
最后,与您的讲师交谈,他们会为您提供更多帮助。
您是否正在使用宏作为输出?
应该是...
mov eax, 0
myloop: cmp eax, 10 jg done output macro eax add eax, 2 jmp myloop done:
当然是8086组装的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.