1.8086模拟器8086tiny源码分析(3)剩下的汇编汇编mov指令
2.8086————汇编语言程序代码———数据查找?
8086模拟器8086tiny源码分析(3)剩下的mov指令
深入分析模拟器中的mov指令
首先解析mov [bx],ax指令,指令码显示源寄存器为ax,源码并且目的代码寄存器为[bx],故此为mov [bx],汇编汇编ax
紧接着,分析mov [bx],源码谷粒商城项目源码h。通过指令码,代码英雄联盟系统源码可以明确得知此指令将立即数写入内存,汇编汇编目的源码操作数为[bx],即mov [bx],代码h
接着是mov bx,h。指令码表明该指令将立即数写入寄存器bx,汇编汇编故此为mov bx,源码h
分析mov [h],ax。指令码指示该指令将数据写入内存地址0x,代码故为mov [h],汇编汇编成吉思汗ol全套源码ax
随后是mov ax, [h]。指令码说明此指令将内存地址0x的源码数据读入ax寄存器,故mov ax,代码 [h]
至此,关于mov指令的分析结束。读者现在应能自行处理CPU指令码到汇编语言的柠檬视频APP源码转换。掌握此技能,为模拟CPU奠定了坚实的基础。
————汇编语言程序代码———数据查找?
; 从键盘输入N+1个数,对前N个数进行选择排序,图片转直链源码再用折半查找判断第N+1个数是否在前N个数中,输出结果。; 输入数据最大为位
CODE SEGMENT
ASSUME CS:CODE
START: PUSH CS
POP DS
PUSH CS
POP ES
CALL INPUTNUM
LEA DI,@ARRAY
MOV CX,@NUM
DEC CX
CALL SELECTSORT
MOV AH,2
MOV DL,
INT H
MOV DL,
INT H
LEA SI,@ARRAY
MOV CX,@NUM
DEC CX
CMP CX,0
JZ @EXIT
CLD
@1:
LODSW
CALL DSPAXS
LOOP @1
MOV AH,2
MOV DL,
INT H
MOV DL,
INT H
LEA SI,@ARRAY
MOV CX,@NUM
DEC CX
MOV BX,CX
SHL BX,1
ADD BX,SI
CALL FIND
CALL DSPAXS
@EXIT:
MOV AH,4CH
INT H
;==============================================================
; 查找的 元素地址 在 bx,数组首地址 为 si , 元素个数为 cx
; 若找到 ax=找到的序号(从0开始), 否则 ax=-1 (FFFF)
FIND PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
MOV @X0_F,0
MOV @X1_F, CX
DEC WORD PTR @X1_F
MOV AX,@X0_F
SHL AX,1
ADD AX,SI
MOV DI,AX
MOV AX,[DI]
MOV @Y0_F,AX
MOV AX,@X1_F
SHL AX,1
ADD AX,SI
MOV DI,AX
MOV AX,[DI]
MOV @Y1_F,AX
@FIND0:
MOV AX,@X1_F
SUB AX,@X0_F
CMP AX,1
JL @FINDORNO1
JE @FINDORNO2
MOV AX,@X0_F
ADD AX,@X1_F
SHR AX,1
MOV @XX_F,AX
SHL AX,1
ADD AX,SI
MOV DI,AX
MOV AX,[DI]
MOV @YY_F,AX
MOV DX,@YY_F
MOV AX,@XX_F ;======
CMP [BX],DX
JE @FINDEXIT
JG @FIND1
MOV AX,@XX_F
MOV @X0_F,AX
MOV AX,@YY_F
MOV @Y0_F,AX
JMP @FIND0
@FIND1:
MOV AX,@XX_F
MOV @X1_F,AX
MOV AX,@YY_F
MOV @Y1_F,AX
JMP @FIND0
@FINDEXIT:
POPF
POP DI
POP SI
POP DX
POP CX
POP BX
RET
@FINDORNO1:
MOV AX,@X0_F
MOV DX,@Y0_F
CMP [BX],DX
JE @FINDEXIT
MOV AX,-1
JMP @FINDEXIT
@FINDORNO2:
MOV AX,@X0_F
MOV DX,@Y0_F
CMP [BX],DX
JE @FINDEXIT
MOV AX,@X1_F
MOV DX,@Y1_F
CMP [BX],DX
JE @FINDEXIT
MOV AX,-1
JMP @FINDEXIT
@X0_F DW 0
@X1_F DW 0
@XX_F DW 0
@Y0_F DW 0
@Y1_F DW 0
@YY_F DW 0
FIND ENDP
;===============================================================
; 键盘输入数值数组子程序(数组名为@array,元素个数存放在@num中)
; 可以是负数
; 采用字符串缓冲输入,避免原来键入后不能回退修改的问题 !
INPUTNUM PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
; 对数组@array清零
MOV CX,
MOV AX,0
LEA DI,@ARRAY
REP STOSW
MOV WORD PTR @NUM,0
; 输入的数据以一个空格分隔,以回车符结束输入
LEA DX,@STRA
MOV AH,
INT H
MOV CL,@STRN
MOV CH,0
MOV WORD PTR @STRM,CX
LEA SI,@STR
CLD
LEA DI,@ARRAY
MOV WORD PTR @NUM,0
@STIN:
MOV AX,0
PUSH AX
MOV BYTE PTR @SIGNN,0
@AGAIN1:
CMP WORD PTR @STRM,0
JE @LINE0
LODSB
DEC WORD PTR @STRM
CMP AL,' '
JE @LINE0
CMP AL,'-'
JNE @INPUT1
MOV BYTE PTR @SIGNN,1
JMP @AGAIN1
@INPUT1:
SUB AL,H
MOV AH,0
MOV BX,AX
POP AX
MOV CL,
MOV CH,0
MUL CX
ADD AX,BX
PUSH AX
JMP @AGAIN1
@LINE0:
POP AX
CMP BYTE PTR @SIGNN,1
JNE @INPUT2
NEG AX
@INPUT2:
MOV WORD PTR[DI],AX
INC WORD PTR @NUM
CMP WORD PTR @STRM,0
JE @STINEND
INC DI
INC DI
JMP @STIN
@STINEND:
POPF
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
@STRA DB
@STRN DB ?
@STR DB DUP(?)
@STRM DW 0
@ARRAY DW DUP(0)
@NUM DW 0
@CHAR DB ?
@SIGNN DB 0
INPUTNUM ENDP
;=========================================
SELECTSORT PROC NEAR
; 数组起始地址 存入 di,元素个数 存入 cx
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
CMP CX,1
JE @@SELE5
DEC CX ; ################
MOV BX,0
@@SELE1:
PUSH CX
MOV SI,DI
INC SI
INC SI ; { SI=DI+2}
PUSH DI ;{ 保存DI }
MOV AX,[DI][BX] ; { 假设MAX 为第一个}
@@SELE2: MOV DX,[SI][BX] ; { 存储器到寄存器,节省时间}
CMP AX,DX
JGE @@SELE3 ; 从大到小,有符号数排序 #################
MOV DI,SI ; { 小于时,将SI替换DI,即将J替换I, 保存MAXI}
MOV AX,DX ; { 保存MAX 到AX}
@@SELE3: INC SI
INC SI
LOOP @@SELE2
MOV SI,DI ; { 还原SI,即将I替换J}
POP DI ; { 取出栈中保存的I}
CMP DI,SI ; { 与J 比较}
JE @@SELE4 ; { 相同时不交换}
MOV AX,[DI][BX] ; { 在内循环之外交换}
XCHG AX,[SI][BX]
MOV [DI][BX],AX
@@SELE4: INC BX
INC BX
POP CX
LOOP @@SELE1
@@SELE5:
POPF
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
SELECTSORT ENDP
;==================================
; 输出有符号数,输出的数应放 ax中
DSPAXS PROC NEAR
PUSH AX
OR AX,AX
JNS @DSPAXS
NEG AX
PUSH AX
PUSH DX
MOV AH,2
MOV DL,'-'
INT H
POP DX
POP AX
@DSPAXS:
CALL DSPAX
POP AX
RET
DSPAXS ENDP
;===============================
DSPAX PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
XOR CX,CX
MOV BX,
@DSPAX1:
XOR DX,DX
DIV BX
INC CX
OR DX,H
PUSH DX
CMP AX,0
JNE @DSPAX1
MOV AH,2
@DISPAX2:
POP DX
INT H
LOOP @DISPAX2
MOV DL,
INT H
POPF
POP DX
POP CX
POP BX
POP AX
RET
DSPAX ENDP
;================================
CODE ENDS
END START