比较 8086 汇编语言中的十六进制整数不起作用
Comparing hexadecimal integers in 8086 Assembly Language not working
我正在尝试编写一个 8086 程序来比较以十六进制编写的整数数组。我知道最高数字是 0xFF 但它不会导致它成为最大值。 (我也不确定我是否正确结束了程序。这是我的代码:
DATA SEGMENT ;declares the data segment
SIZEA DW 10
MAXV DW 0
INTARR DW 0x1,0x2,0x4,0xFF,0xFE,0xFA,0x7,0x9,0x8,0xFD
DATA ENDS ;ends the data segment
CODE SEGMENT ;declares the code segment
START: ;declares start label
MOV AX,DATA ;moves the data to the AX register
MOV DS,AX ;moves the date from the AX reg to DS
LEA SI,INTARR ;loads the address of INTARR to SI
MOV BX,INTARR[SI] ;loads the first array item into BX
MOV CX, SIZEA ;loads the size of the array to CX
MOV DX, MAXV ;loads the maxv variable to DX
THELOOP: ;This is where the loop starts
MOV BX,INTARR[SI] ;loads the array item at index SI
CMP MAXV,BX ;compares BX to the value of MAXV
JGE SKIP ;goes to SKIP if MAXV is greater
MOV MAXV,BX ;if BX is greater BX moves to DX
SKIP: ;this is the skip label
INC SI ;increments SI for the next loop
LOOP THELOOP ;loops
CODE ENDS ;ends the segment
END START ;ends start label
ret
我用的是emu8086。当我模拟它并观察变量时,它表明 MAXV 是 0900h。它贯穿了大约 20 个 NOP 命令。任何帮助将不胜感激!
好的,这是我在您的代码中看到的所有问题:
- SIZEA 和 MAXV 是地址。所以当你写
MOV CX,SIZEA
时,你加载的不是 SIZEA 的内容,而是它的地址。这不是你想要的。你想写 MOV CX,[SIZEA]
- 我不确定 emu8086 是如何工作的,因为我从未使用过它。但是,您设置数据段的方式看起来有点可疑。你不是在段寄存器中加载偏移地址吗?
ret
是您函数的一部分,应该在您的代码段中。不过不知道有没有有效的code to return to.
- 第一个 lea 指令没有按照您的要求执行,只需将其删除
- 第一个
MOV BX,INTARR[SI]
是多余的,可以删除。
- 您只将 SI 增加一个字节,但是数组条目的长度是一个字(2 个字节)
以下是我为使您的代码正常工作所做的更改。请注意,这不是针对 emu8086 的,而是针对标准 NASM 的:
START: XOR AX,AX ; Clear data segment, may not be how you do it on emu8086
MOV DS,AX
MOV SI,AX ; Clear the Source index
MOV CX,[SIZEA]
XOR DX,DX ; Note how I just clear DX, no need to load 0 from memory
; DX will then contain highest value
THELOOP:MOV BX,[INTARR+SI] ; I am just using this syntax because it is the standard for NASM
CMP DX,BX ; Compare max value with current value
JGE SKIP
MOV DX,BX ; Now just move the max value to the register
SKIP: ADD SI,2 ; Move by 2 bytes since it is a word array
LOOP THELOOP ;
MOV [MAXV],DX ; Now you can save the highest value to memory
; less memory access so faster execution
RET
; DATA
SIZEA DW 10
MAXV DW 0
INTARR DW 0x1,0x2,0x4,0xFF,0xFE,0xFA,0x7,0x9,0x8,0xFD
我正在尝试编写一个 8086 程序来比较以十六进制编写的整数数组。我知道最高数字是 0xFF 但它不会导致它成为最大值。 (我也不确定我是否正确结束了程序。这是我的代码:
DATA SEGMENT ;declares the data segment
SIZEA DW 10
MAXV DW 0
INTARR DW 0x1,0x2,0x4,0xFF,0xFE,0xFA,0x7,0x9,0x8,0xFD
DATA ENDS ;ends the data segment
CODE SEGMENT ;declares the code segment
START: ;declares start label
MOV AX,DATA ;moves the data to the AX register
MOV DS,AX ;moves the date from the AX reg to DS
LEA SI,INTARR ;loads the address of INTARR to SI
MOV BX,INTARR[SI] ;loads the first array item into BX
MOV CX, SIZEA ;loads the size of the array to CX
MOV DX, MAXV ;loads the maxv variable to DX
THELOOP: ;This is where the loop starts
MOV BX,INTARR[SI] ;loads the array item at index SI
CMP MAXV,BX ;compares BX to the value of MAXV
JGE SKIP ;goes to SKIP if MAXV is greater
MOV MAXV,BX ;if BX is greater BX moves to DX
SKIP: ;this is the skip label
INC SI ;increments SI for the next loop
LOOP THELOOP ;loops
CODE ENDS ;ends the segment
END START ;ends start label
ret
我用的是emu8086。当我模拟它并观察变量时,它表明 MAXV 是 0900h。它贯穿了大约 20 个 NOP 命令。任何帮助将不胜感激!
好的,这是我在您的代码中看到的所有问题:
- SIZEA 和 MAXV 是地址。所以当你写
MOV CX,SIZEA
时,你加载的不是 SIZEA 的内容,而是它的地址。这不是你想要的。你想写MOV CX,[SIZEA]
- 我不确定 emu8086 是如何工作的,因为我从未使用过它。但是,您设置数据段的方式看起来有点可疑。你不是在段寄存器中加载偏移地址吗?
ret
是您函数的一部分,应该在您的代码段中。不过不知道有没有有效的code to return to.- 第一个 lea 指令没有按照您的要求执行,只需将其删除
- 第一个
MOV BX,INTARR[SI]
是多余的,可以删除。 - 您只将 SI 增加一个字节,但是数组条目的长度是一个字(2 个字节)
以下是我为使您的代码正常工作所做的更改。请注意,这不是针对 emu8086 的,而是针对标准 NASM 的:
START: XOR AX,AX ; Clear data segment, may not be how you do it on emu8086
MOV DS,AX
MOV SI,AX ; Clear the Source index
MOV CX,[SIZEA]
XOR DX,DX ; Note how I just clear DX, no need to load 0 from memory
; DX will then contain highest value
THELOOP:MOV BX,[INTARR+SI] ; I am just using this syntax because it is the standard for NASM
CMP DX,BX ; Compare max value with current value
JGE SKIP
MOV DX,BX ; Now just move the max value to the register
SKIP: ADD SI,2 ; Move by 2 bytes since it is a word array
LOOP THELOOP ;
MOV [MAXV],DX ; Now you can save the highest value to memory
; less memory access so faster execution
RET
; DATA
SIZEA DW 10
MAXV DW 0
INTARR DW 0x1,0x2,0x4,0xFF,0xFE,0xFA,0x7,0x9,0x8,0xFD