【问题标题】:Assembly x8086 swap array values汇编 x8086 交换数组值
【发布时间】:2018-12-18 09:45:35
【问题描述】:

我有一个问题要编写一个可以得到 8 个字符/数字的代码 它会在它们之间每 2 个字节交换一次。

例子:

输入 451ABD45

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

NewARR = |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

我的输入 451ABD45

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

MY_NewARR = |35|34|41|35|44|41|35|44

我的输出 54A5DA5D

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

【问题讨论】:

    标签: assembly tasm emu8086


    【解决方案1】:

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

    例如,在第一次迭代之前你有这个:

    '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 被声明为一个字数组,您也希望访问单个字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多