求两个十六位数和并在屏幕上显示问题
大家帮我看一下这个程序,哪儿错了,结果怎么不对(显示错误的0002)啊
- Assembly code
DATA SEGMENT DW 1234H DW 5678HBUF DB 4 DUP (?) DB '$'DATA ENDSSTACK SEGMENT PARA STACK 'STACK'POINT DB 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET POINT + 100 MOV AX, [0000] ADD AX, [0002] MOV BL, 4 MOV DI, OFFSET BUF MOV CL, 12NEXT0: ROR AX, CL MOV DL, AL AND DL, 0FH ADD DL, 30H CMP DL, 3AH JC NEXT1 ADD DL, 7NEXT1: MOV [DI], DL INC DI DEC BL JNZ NEXT0 MOV DX, OFFSET BUF MOV AH, 09h INT 21H MOV AH, 4CH INT 21HCODE ENDS END START
[解决办法]
那两指令应采用下面这样的形式:
MOV AX, ds:[0000]
ADD AX, ds:[0002]
这是因为不加上 DS: 的段修饰符的话,汇编程序会把 [0002] 当做 2 这样的立即数,而不是你初衷的内存地址。这算是个约定吧,可能来源最初汇编程序设计上的问题,但却一直保留下来了。
[解决办法]
MOV AX, [0000]
ADD AX, [0002]
将上面的改成
MOV AX, ds:[0000]
ADD AX, ds:[0002]
我在dos下,改完之後就可以示正的果