Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 程序集x8086交换数组值_Assembly_Tasm_Emu8086 - Fatal编程技术网

Assembly 程序集x8086交换数组值

Assembly 程序集x8086交换数组值,assembly,tasm,emu8086,Assembly,Tasm,Emu8086,我有一个问题要写一个能得到8个字符/数字的代码 它将在它们之间每隔2个字节交换一次 例如: 输入451ABD45 ARR=| 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35 纽瓦尔=| 35 | 34 | 41 | 31 | 44 | 42 | 35 | 34 输出54A1DB54 我的代码: STA SEGMENT STACK DB 100H DUP (0) STA ENDS DATA SEGMENT MSG DB 'Please Enter 8

我有一个问题要写一个能得到8个字符/数字的代码 它将在它们之间每隔2个字节交换一次

例如:

输入451ABD45

ARR=| 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35

纽瓦尔=| 35 | 34 | 41 | 31 | 44 | 42 | 35 | 34

输出54A1DB54

我的代码:

STA SEGMENT STACK
    DB 100H DUP (0)
STA ENDS

DATA SEGMENT
    MSG DB 'Please Enter 8 Chars : $'
    DIM DW 10 DUP(?)
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STA
MAIN:
    MOV AX, DATA
    MOV DS, AX
    LEA DX, MSG
    MOV AH, 9H
    INT 21H
    MOV DL, 10
    MOV AH, 02H
    INT 21H
    MOV DL, 13
    MOV CX, 8
    MOV BX, 0
    MOV DX, 0
INPUT:
    MOV AH, 1H
    INT 21H
    MOV AH, 0
    MOV DIM[BX], AX
    INC BX
    LOOP INPUT
    MOV CX, 4
    MOV BX, 0
EXCHANGE:
    MOV DX, DIM[BX] ;0
    INC BX ;1
    MOV AX, DIM[BX] ;1
    DEC BX ;0
    MOV DIM[BX], AX ;0
    ADD BX, 1 ;1
    MOV DIM[BX], DX ;1
    INC BX
    LOOP EXCHANGE
    MOV DL, 10
    MOV AH, 02H
    INT 21H
    MOV DL, 13
    MOV CX, 8
    MOV BX, 0
    MOV DX, 0
PRINT:
    MOV DX, DIM[BX]
    INC BX
    MOV AH, 2H
    INT 21H
    LOOP PRINT
    MOV AX, 4C00H
    INT 21H
CODE ENDS
    END MAIN
My_输入451ABD45

ARR=| 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35

MY|u NewARR=|35 | 34 | 41 | 35 | 44 | 41 | 35 | 44

My_输出54A5DA5D


我的代码有什么问题,谢谢您的帮助

您正在加载和存储单词(16位值),而您的字符每个只有一个字节

例如,在第一次迭代之前,您有:

'4','5','1','A','B','D','4','5'
'5','4','1','A','B','D','4','5'
 |   |
 \  /
swapped
在第一次迭代之后,您应该有:

'4','5','1','A','B','D','4','5'
'5','4','1','A','B','D','4','5'
 |   |
 \  /
swapped
但你最终要做的是:

'5','1','1','A','B','D','4','5'
|    |
\   /
AX is stored

'5','4','5','A','B','D','4','5'
    |    |
    \   /
    DX is stored
等等,这条线的其余部分


固定且稍微简化的交换循环可能如下所示:

EXCHANGE:
  MOV DH,BYTE PTR [BX + DIM]   ; First character in high byte of DX
  MOV DL,BYTE PTR [BX + DIM+1] ; Second character in low byte of DX
  MOV [BX + DIM],DX            ; DX contains the byte-swapped pair
  ADD BX,2                     ; Move to next pair of characters
  LOOP EXCHANGE

它不起作用。它给我一个错误操作数类型与MOV DH、[BX+DIM]MOV DL、[BX+DIM+1]不匹配好的,这是TASM的问题。尝试使用
BYTE PTR
(例如
MOV DH,BYTE PTR[BX+DIM]
)非常好,非常感谢=D(BYTE PTR是什么?)它是一个大小说明符,告诉TASM,即使
DIM
声明为一个单词数组,您也希望访问单个字节。