在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/網(wǎng)絡(luò)安全/ masm編程ADD參數(shù)問題

masm編程ADD參數(shù)問題

以下代碼在編譯時在 代碼標(biāo)記處 出現(xiàn) probably no zero prefix for hex; or no 'h' suffix; or wrong addressing; or undefined var: [DX] 錯誤
請問這是為什么
代碼的作用是將存在四個字組中的5個學(xué)生的成績分別求總和,使用了雙重循環(huán)

DATA SEGMENT
COURSE1 
DB 70H,80H,90H,60H,50H
DB 75H,85H,95H,65H,55H
DB 89H,84H,38H,92H,43H
DB 34H,32H,53H,35H,21H
NUM1 DW 5 DUP(?)
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START:
MOV AX,DATA
MOV DS,AX
LEA SI,COURSE1
LEA DI,NUM1
SUB SI,1
MOV CX,5

A1:
INC SI
SUB AX,AX
MOV DX,SI

A2:
MOV BL,4  
ADD AL,[DX]  # <-- 這里報錯
DAA     
ADC AH,0
ADD DX,5
DEC BL
JNZ A2
MOV [DI],AX
INC DI
LOOP A1
MOV AH,4CH
INT 21H
CODE ENDS
     END START
回答
編輯回答
乖乖瀦

某些寄存器不允許做尋址操作,例如 DX,因此 [DX] 無法編譯。
可尋址的寄存器取決于 CPU 架構(gòu),16、32、64位不盡相同,保險的辦法是使用 (E)SI(E)DI。具體情況請查閱 Intel 相關(guān)文檔。

另外,你的代碼有瑕疵,第二重循環(huán)是死循環(huán)

A2:
MOV BL,4  
...
DEC BL
JNZ A2

附上參考例子,希望有益

; 使用 fasm 編譯 https://flatassembler.net/
include 'win32ax.inc'

; .data SECTION ;;;;;;;;;;;;;;;;;;;;;
.data

COURSE:
DB 70H,80H,90H,60H,50H
DB 75H,85H,95H,65H,55H
DB 89H,84H,38H,92H,43H
DB 34H,32H,53H,35H,21H

SUM:
DW 5 DUP(0)  # 各列之和,初始化為 0


; .code SECTION ;;;;;;;;;;;;;;;;;;;;;
.code
start:
XOR ECX, ECX ; 列標(biāo)
MOV EDI, SUM

each_column:  ; 循環(huán)每一列
  XOR EDX, EDX ; 行標(biāo)
  XOR AX, AX ; 和
  MOV ESI, COURSE
  ADD ESI, ECX

  each_row:   ; 循環(huán)每一行
    XOR BX, BX
    MOV BL, [ESI]
    ADD ESI, 5
    ADD AX, BX

    INC EDX
    CMP EDX, 4  ; 最多 4 行
    JL each_row

  row_finished:
    MOV [EDI], AX
    ADD EDI, 2  ; WORD

  INC ECX
  CMP ECX, 5  ; 最多 5 列
  JL each_column

column_finished:

invoke  ExitProcess,0

.end start

學(xué)習(xí)匯編的另一種方式是:用 c 語言編寫代碼段,然后編譯成匯編指令去理解。

2018年7月31日 11:41