Assembly 汇编8086程序
我不熟悉汇编语言,这是一些我不懂的代码,希望有人能帮我Assembly 汇编8086程序,assembly,x86-16,Assembly,X86 16,我不熟悉汇编语言,这是一些我不懂的代码,希望有人能帮我 DATA SEGMENT VALUES DB 1,2,3,4,5,6,7,8,9 ITEM DB 6 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DX,AX LEA SI,VALUES MOV AL,ITEM COMPARE: CMP AL,[SI] JZ F
DATA SEGMENT
VALUES DB 1,2,3,4,5,6,7,8,9
ITEM DB 6
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DX,AX
LEA SI,VALUES
MOV AL,ITEM
COMPARE: CMP AL,[SI]
JZ Found
INC SI
LOOP COMPARE
CLC
JMP EXIT
Found: STC
EXIT: MOV AH,4CH
INT 21H
ENDS
CODE END
这个程序应该在1,2,3,4,5,6,7,8,9
我了解它的工作原理,但我有几个问题:
CLC
和STC
??我知道他们把CF
归为0和1,但我们为什么要用它呢退出
标签之后使用MOV-AH,4CH
inMOV-DX,AX
MOV-DX,数据
最后,有人能推荐一本学习汇编的好书吗?该算法在数字列表中搜索一个数字 如果找到,则设置
CF
。如果未找到,则清除CF
INT 21H是MS-DOS服务中断。函数4Ch以AL中的错误代码(包含要查找的编号)结束程序
这是错误的。它必须是:
MOV AX,DATA
MOV DS,AX
我们将数据段的地址写入
DS
寄存器,以便cpu知道要查找数据的地址。由于x86指令集的限制,我们无法编写movds,DATA
,也就是说CPU中没有实现这样的功能。每当将段地址写入段寄存器时,必须使用AX
作为介质。这里的循环
指令很奇怪。仅当CX
不为零时,此指令才会递减CX
,并跳转。这意味着循环运行CX
次,但程序从未设置CX
CX
在输入时很可能为零,第一个减量将使其为65535,因此它实际上将最多循环65536次,如果找不到元素,则搜索超过列表末尾
要使其正确,请在循环开始之前添加MOV-CX,ITEM-VALUES
。由于项
紧跟在值之后,因此减去它们的地址将给出列表中的字节数(元素)
通常会在列表末尾添加一个标签,以使此类计算更加可靠
VALUES DB 1,2,3,4,5,6,7,8,9
VALUES_END LABEL BYTE
; ...
MOV CX, VALUES_END - VALUES
COMPARE: ; ...
LOOP COMPARE
这是错误的
正确答案是:
MOV AX,DATA
MOV DS,AX
我们不能直接将数据从内存发送到段寄存器(DS)。因此,我们通过通用寄存器(AX)发送数据。
CLC
指令用于“清除进位标志”,而STC
指令用于“设置进位标志”。这些是过程控制指令,用于通过设置/重置标志值来控制处理器操作
- 在ALP中,我们只能通过以下方式将数据加载到段寄存器中:首先将其加载到通用寄存器,然后我们必须将其从通用寄存器移动到段寄存器,这就是语法的方式
MOV-AH,4CH
用于从当前进程终止。通过将4CH
的十六进制值存储(move=MOV)到AH
寄存器中
MOV-AX,DATA
指令是在AX中加载数据段起始地址的方法。然后使用movds,AX
,初始化数据段
哦,孩子!一次三个编辑=P我保留了图书推荐位。搜索图书推荐请参见:LOOP是286+,无论如何都不能初始化cx。@bestsss:LOOP
绝对不是286+。所有形式的循环
都是8086级指令。然而,cx
缺少初始化是正确的。我在问题下面提到过,但是循环是286,可能您想要CMP SI、XXX(可能是项目的addr)和jnz,而不是循环。在这种情况下,SCASB可能是最好的。mov-DS,immediate
不能作为x86机器指令编码,但源代码必须是GP寄存器这一点并不完全正确。它还可以move es,[bx]
从内存进入段寄存器(),甚至pop-ds
进入段寄存器。这在这里对数据段没有用处,但是您的语句并没有局限于该用例。另外,mov-ah,4Ch
本身并没有终止程序。int21h
处理程序在AH中查找呼叫号码;这就是在运行int21h
之前将其设置为DOS呼叫号码的原因。
VALUES DB 1,2,3,4,5,6,7,8,9
VALUES_END LABEL BYTE
; ...
MOV CX, VALUES_END - VALUES
COMPARE: ; ...
LOOP COMPARE
MOV AX,DATA
MOV DX,AX
MOV AX,DATA
MOV DS,AX
MOV AX,DATA
MOV DS,AX