如果你能"翻译"对我来说这部分代码。我把它从我在学校的代码中分开了。我生病了,我没有看过我的课,现在我有一个空白(因为我失去了教训),我无法理解我尝试上网但我失败了。如果你能从中理解这些并给我回答我会很高兴
main proc
1)汇编中main proc
是什么?它有什么作用?我该怎么做到这一点?
MAIN endp
2)与之前相同。为什么主要资本化?
findchar PROC
3)findchar
是指尝试查找char,但是PROC?
S_LOOP
LOOP S_LOOP
4)这是什么循环?
findchar endp
5)当我们找到char时,MAIN会结束,对吧?
soros segment stack
6)这对堆栈有什么作用?至于我的代码:
ASSUME CS:KODIKAS, DS:DEDOMENA, ss:soros
*
Buffer 40DB dub(0)
7)它用于"消息"?
db 256 dup(0)
8)同样用小写字母和256?什么是256? :/
它的希腊语
TITLE SIMPLE_ADD
KODIKAS SEGMENT
ASSUME CS:KODIKAS, DS:DEDOMENA,ss:soros
ARXI:
main proc
MOV AX,DEDOMENA
MOV DS,AX
MOV SI,0
LEA DX,MINIMA
MOV AH,9
INT 21H
XANA:
MOV AH,1
INT 21H
CMP AL,35 ;GIA ENTER
JE CHECK
SAVE:
MOV BUFFER[SI],AL
INC SI
CMP SI,80
JB XANA
CHECK:
call findchar
MOV AH,4CH
INT 21H
MAIN endp
findchar PROC ;uporoutina
MOV CX,SI
JCXZ EXIT
MOV SI,0
LEA DX,MINIMA2
MOV AH,9
INT21H
MOV ah,1
INT 21h
MOV BL,0
MOV DL,AL
findchar proc
MOV CX,SI
JCXZ EXIT
MOV SI,0
mov bl,0
LEA DX,MINIMA2
MOV AH,9
INT 21H
mov ah,1
int21h
S_LOOP
cmp al, BUFFER[SI]
jne next
inc bl
next:
inc si
LOOP S_LOOP
MOV bl,0
je nochar
lea dx,yparxei
mov ah,9
int 21h
cmp bl,9
ja dipsifios
mov dl,bl
add dl,48
mov ah,2
int 21h
ret
dipsifios:
MOV al,bl
mov ah,0
mov cl,10
div cl
mov ch,ah
mov dl,al
add dl,48
mov ah,2
int 21h
ret
nochar: ;den uparxei
LEA DX,MINIMA3
MOV AH,9
INT21H
findchar endp
KODIKAS ENDS
DEDOMENA SEGMENT
BUFFER 40DB dub(0)
MINIMA1 DB 10,13, "Eisagete keimeno : $"
MINIMA2 DB 10,13,"Eisagete char gia anazitisi :$"
MINIMA3 DB 10,13,"Den yparxei kanenas xaraktiras :$"
YPARXEI DB 10,13,"O xarakthras yparxei fores : $"
BUFFER DB 80 DUP(0)
DEDOMENA ENDS
soros segment stack
db 256 dup(0)
END ARXI
答案 0 :(得分:0)
1)2)和3)
这些是emu8086(和MASM / TASM)汇编程序指令,不是x86 machine code的一部分。我不愿意深入研究它们,因为我不再使用它们,你可以轻松地为它们谷歌文档。
此外,符号名称看起来不区分大小写,否则main
vs MAIN
会在编译期间导致语法错误(这也是我不使用它们的另一个原因)。
对您而言,最重要的一点是,这些不会为CPU生成任何机器代码。它们只是帮助组织源代码,并为汇编程序生成一些符号(标签),因此您可以使用它的符号名称call findchar
来处理程序的入口点,并让汇编程序找出第一个距离findchar
的指令是将其编码到call
指令操作码中。
如果call -87
代码在findchar
指令之前的84字节开始(IIRC为{{1},那么在没有符号的情况下,您必须手动计算差异并编写例如call
。操作码长3个字节,因此84 + 3 = 87)。
call
S_LOOP
LOOP S_LOOP
是标签定义,但它最后缺少冒号(S_LOOP
),这让我感到困惑,可能是另一种在emu8086中有效的语法怪癖。因此,结果又是汇编程序符号表中的符号。
S_LOOP:
是实际的x86指令loop
。
每当您不确定某些x86指令的作用时,请查看英特尔参考指南中的说明。
5)和6)
再次是汇编程序指令,你甚至都不是他们的意思。
顺便说一句,停止猜测汇编程序中的内容意味着什么。这是没用的。在其中一个参考指南中找到它的定义。汇编程序不像高级语言,被定义为具有良好的可读性。它是硬件设计的CPU指令的别名,并且通常会发生很多微小的细节(通常是出于非常好的理由,可以通过简单的方式在代码中完成某些事情,有时仅仅因为设计它更便宜那)。因此,例如,指令LOOP S_LOOP
也将DIV bx
和ax
作为输入,并修改dx
和ax
。你只有机会从“dx
”中猜出来。
(我知道3个不同CPU的汇编,有几种不同的汇编语法方言,但每当我试着猜测不同目标CPU的源代码时,我经常失败并且必须谷歌文档)
DIV bx
7)它的“信息”?
我很确定这不会编译,因为它在语法上是错误的。
原始行非常可能Buffer 40DB dub(0)
,它使用两个汇编程序指令,定义标签,实际上定义了一个字节值。
Buffer DB 40 DUP (0)
是标签定义,再次添加冒号不会造成伤害,实际上它可能在某些情况下有所帮助,所以尽量在Buffer
之前使用Buffer:
。
DB
是非常常见的汇编程序指令,可能在所有x86汇编程序中共享。它的意思是“定义字节”。所以它告诉汇编器你将把数字字节值放在它之后,而不是指令助记符,汇编器应该把你提供的值放到机器代码中。
DB
是MASM / TASM / emu8086特定指令,告诉编译器多次复制<times> DUP (<value>)
<value>
,因此您不必手动编写<times>
该行将编译为40个零字节(可能作为某些字符串的缓冲区,我实际上没有检查代码,它做了什么,只有你的问题)。
db 256 dup(0)
8)同样用小写字母和256?什么是256?
大多数汇编程序不区分大小写,因此您可以根据自己的喜好编写指令和指令。因此,DB 0, 0, 0, ..., 0 ; 40 zeroes
为db
,DB
为dup
,两者都在上面解释(这一个将产生256个字节,机器代码中的值为零)。
符号名称不区分大小写有点令人惊讶,如果你认为emu8086试图模仿MASM(Microsoft Assembler),那就再好不过了。