一个简单的汇编问题 call word ptr...
展开全部 问题在于 没弄清楚 1.call指令2.dword,word。
两段代码差别在于第一段的call后面是word ptr ds:[0],而第二段是dword。
首先call会把返回地址压栈,导致栈顶指针sp减小,减少量由地址长度定。
然后第一段代码压的是word,16位的地址,于是sp-2,第二段dword,32位地址故sp-4。
...
汇编,下面的程序执行后,ax中的数值为多少。
call word ptr ds:[0eh] 执行时分两步 1 把ip压入栈中2 jmp word ptr ds:[0eh]用 ds:[0eh] 单元内容修改ip 当执行call 指令时ip已经装入了 第一条inc ax的指令的地址,所以在步骤1中压入的就是第一条inc ax的指令的地址。
在前面mov ax,stack mov ss,ax mov sp,16 mov ds,ax 显然ds ss 是同一段,栈顶指针在16也就是10h,压入ip(第一条inc ax的指令的地址,16位偏移地址)后,(sp)-2 = 0eh,而此时要转去以ds:[0eh]单元内容为地址的地方执行,这个地址恰恰是第一条inc ax的指令的地址((ds)=(ss),(sp)=0eh),所以当call word ptr ds:[0eh] 指令执行后cpu 将继续向下执行call word ptr ds:[0eh]的下一条指令之前(ax) = 0 三个inc ax 后 等于3
王爽 汇编语言
1.table有4个表目,每个指向一个子程序的偏移地址2.ah是8位寄存器(字节),用来传送子程序编号,对头3.add bx,bx是为了由子程序编号得到存放对应子程序的偏移地址的表目的偏移地址(有点拗口),可替换为shl bx,14.add bx,bx怎么会得双字,顶多就17位,就是说可能溢出5.table[bx]是内存单元,对,寄存器相对寻址。
他的宽度,要看环境。
如另外一个操作数或者word ptr table[bx]多加分,少匿名,会有很多人答!
调用子程序指令如call执行后,sp保持不变
展开全部 1.调用指令CALL调用指令CALL的基本功能就是将返回地址(即:调用指令的下一条指令的地址)压入堆栈,并转向子程序的入口地址处;调用指令可分为段内调用和段间调用;段内调用时,由于主程序与子程序在同一个段内,因此,调用前后,段寄存器CS的内容不会发生变化,因而,返回地址只需保存偏移地址即可,比如上述调用指令中的前两条指令;段间调用时,主程序与子程序不在同一个段内,此时,调用指令执行后,CS和IP的内容都会发生变化,因此,保存的返回地址必须要包含它的段地址和段内偏移地址两个部分;子程序入口地址的寻址方式与无条件转移指令的待转向地址的寻址方式基本相同;(1).段内直接调用指令"CALL OPR":指令中的OPR为子程序名,它代表了子程序的入口地址,其寻址方式为相对寻址方式;相对位移量是16位,它是子程序入口地址与返回地址的差值;(2).段内间接调用指令"CALL OPR1":指令中的OPR1指出了存放子程序入口地址的那个存储单元,上述指令中的EA即为OPR1的有效地址,其寻址方式可以是除了立即数寻址方式和段寄存器寻址方式之外的任何寻址方式;因为是段内调用,所以,EA对应存储单元中存放的是子程序入口地址的16位偏移地址;(3).段间直接调用指令"CALL FAR PTR OPR":指令中的OPR为过程名或子程序名,同样代表了过程或子程序的入口地址,其寻址方式为直接寻址方式,即:指令的机器码中直接给出了过程或子程序入口地址的段地址和偏移地址;(4).段间间接调用"CALL OPR1":指令中OPR1的含义和寻址方式与段内间接调用指令相同,不同的是有效地址EA对应存储单元中存放的是子程序入口地址的段地址和偏移地址;假设某程序中已经定义了子程序SEARCH1和PMOVE,以及变量SADR,那么,我们有以下调用指令:CALL SREACH1 ;段内直接调用CALL FAR PTR PMOVE ;段间直接调用CALL BX ;段内间接调用CALL WORD PTR [BX] ;段内间接调用CALL SADR ;SADR是字变量,则是段内间接调用;SADR是双字变量,则是段间间接调用...
求解这段汇编代码的问题
这种安装方法,是错误的。
…………rep movsb ------复制代码mov word ptr es:[7ch*4], 200hmov word ptr es:[7ch*4+2], 0 ;修改中断向量mov ax, 4c00h----之后立即就退出了程序int 21h------------程序退出后,原来复制进去的代码,也被系统消除了,不可用了。
易语言置代码 ({ }) pushad () 下如何写以下代码
是 置入代码() 吧? 那个是指机器码,不是汇编指令,比如说汇编指令中的NOP对应的机器码是90(16进制),转换为10进制就是144, 这里的用法就是:置入代码({144}) ~调用格式: 〈无返回值〉 置入代码 (通用型 代码数据) - 系统核心支持库->;其他英文名称:MachineCode在编译后文件代码段中当前语句位置置入指定的机器指令码数据。
本命令为高级命令。
参数<1>;的名称为“代码数据”,类型为“通用型(all)”。
欲置入到代码段中的机器指令码数据,可以是字节集数据或二进制文件名文本。
操作系统需求: Windows、Linux
汇编语言课程设计求程序!题目下面!
; 本程序通过编译,运行正确 Code Segment Assume CS:Code,DS:Code; -----------------------------------------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStr Output MACRO Str_Addr push dx lea dx,Str_Addr mov ah,9 int 21h pop dx EndM; -----------------------------------------; 功能:输出一个字符 ; 入口:dl=要显示的字符 Output_Chr proc Near push ax mov ah,02h int 21h pop ax ret Output_Chr endp ; ----------------------------------------- ; 功能:输出回车换行 Output_CTLF proc Near push ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax ret Output_CTLF endp ; -----------------------------------------; 功能:取光标位置; 入口:无; 出口:DH=行号,DL=列号 GetCursor Proc Near PUSH AX PUSH BX PUSH CX XOR BX,BX MOV AH,3 INT 10H MOV Cursor_Row,DH MOV Cursor_Col,DL POP CX POP BX POP AX RET Cursor_Row DB ?Cursor_Col DB ?GetCursor EndP; -----------------------------------------; 功能:置光标位置; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标) SetCursor Proc Near PUSH CX PUSH BX PUSH AX MOV DH,Cursor_Row MOV DL,Cursor_Col XOR BX,BX MOV AH,2 INT 10H POP AX POP BX POP CX RET SetCursor EndP; -----------------------------------------; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码; 入口:AL; 出口:AL=转换后的ASCII码 AL_ASCII Proc Near cmp al,10 ;AL jb @@To_ASCII ;AL add al,7 ;AL>=10,按大写字母处理 @@To_ASCII: add al,'0' ;转换成相应的数字或大写字母 ret AL_ASCII EndP ; -----------------------------------------; 功能:将AL中的字节数据转换成十六进制显示的ASCII码; 入口:AL; 出口:AX=转换后的ASCII码 Byte_ASCII Proc Near push cx mov cx,4 xor ah,ah ;将AH置0 shl ax,cl ;将AX左移4位 shr al,cl ;将AL右移4位 xchg ah,al call AL_ASCII ;调用子程序,将AL中的值转换成相应的ASCII码 xchg ah,al call AL_ASCII xchg ah,al pop cx ret Byte_ASCII EndP ; -----------------------------------------; 功能:将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示; 入口:AL; 出口:AX=转换后的ASCII码 ByteD_ASCII Proc Near push dx push ax call Byte_ASCII ;将AL中的字节数转换成十六进制显示的ASCII码 cmp al,'9' jbe $+7 mov dl,'0' call Output_Chr ;显示一个字符 mov dl,al call Output_Chr ;显示一个字符 mov dl,ah call Output_Chr ;显示一个字符 mov dl,'H' call Output_Chr ;显示一个字符 pop ax pop dx ret ByteD_ASCII EndP ; -----------------------------------------; 功能:将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示; 入口:AX WordD_ASCII Proc Near push dx push ax push ax xchg ah,al call Byte_ASCII ;将AL中的字节数转换成十六进制显示的ASCII码 cmp al,'9' jbe $+7 mov dl,'0' call Output_Chr ;显示一个字符 mov dl,al call Output_Chr ;显示一个字符 mov dl,ah call Output_Chr ;显示一个字符 pop ax call Byte_ASCII ;将AL中的字节数转换成十六进制显示的ASCII码 mov dl,al call Output_Chr ;显示一个字符 mov dl,ah call Output_Chr ;显示一个字符 mov dl,'H' call Output_Chr ;显示一个字符 pop ax pop dx ret WordD_ASCII EndP ; -----------------------------------------; 功能:输入内存单元的段地址或偏移地址; 入口参数:无; 出口参数:若直接回车(没有输入地址)或地址中含有无效字符,进位标志置位;; 否则,进位标志清位,BX=有效地址 Input_Addr Proc Near lea dx,Buffer ;字符串缓冲区地址 mov ah,0ah int 21h lea si,Buffer[1] ;实际输入的字符数地址 lodsb ;读入实际输入的字符数 test al,0ffh jz @@Invalid xor bx,bx ;有效地址初值 mov cl,al xor ch,ch @@Checking: lodsb ;读入一个字符 cmp al,'0' ;字符 jb @@Letter ;是,判断是否字母 cmp al,'9' ;字符 jbe @@Valid ;是,累加有效地址 @@Letter: mov ah,al and ah,0dfh cmp ah,'A' ;字符 jb @@Invalid ;是,无效字符 cmp ah,'Z' ;字符 ja @@Invalid ;是,无效字符 @@Valid: and al,0fh push cx mov cx,4 shl bx,cl ;有效地址左移4位 or bl,al ;加上低4位 pop cx loop @@Checking ;下一位 clc ;进位标志清位 ret @@Invalid: stc ;进位标志置位 ret Input_Addr EndP; ----------------------------------------- Segment_Str db 'Please input a segment address(heximal): $' Offset_Str db 13,10,'Please input a offset address(heximal): $' Memory_Addr dd ? ;内存地址。
偏移地址在前、段地址在后 Press_Key db 7,13,10,13,10,'Press any key to exit...$' Start: push cs pop ds push cs pop es ;使数据段、附加段与代码段同段 cld Output Segment_Str ;提示输入段地址 call GetCursor ;取光标位置 @@Segment: call SetCursor ;置光标位置 call Input_Addr ;输入地址 jc @@Segment ;若地址无效,重新输入 mov word ptr ...
8255 A直流电机控制实验代码
CODE SEGMENT ASSUME CS:CODE DAPORT EQU 0060H ;da-out port IOCPT EQU 0072H ;C port IOCONPT EQU 0073H ;control port CONTPORT EQU 00DFH DATAPORT EQU 00DEH DATA1 EQU 0500H DATA2 EQU 0510H DATA3 EQU 0518H DATA4 EQU 0519H START: CALL FORMAT MOV AL,89H MOV DX,IOCONPT OUT DX,AL ;write control word MOV DX,IOCPT IN AL,DX ;read the condition of C port DAOUT: MOV BYTE PTR DS:[DATA4],AL CALL BCDCON CALL CONVERS CALL LEDDISP MOV AL,BYTE PTR DS:[DATA4] MOV DX,DAPORT OUT DX,AL READCPT: MOV DX,IOCPT IN AL,DX CMP AL,BYTE PTR DS:[DATA4] JE READCPT JMP DAOUT FORMAT: MOV BX,0 MOV WORD PTR DS:[BX+DATA1],063FH ADD BX,2 MOV WORD PTR DS:[BX+DATA1],4F5BH ADD BX,2 MOV WORD PTR DS:[BX+DATA1],6D66H ADD BX,2 MOV WORD PTR DS:[BX+DATA1],077DH ADD BX,2 MOV WORD PTR DS:[BX+DATA1],6F7FH ADD BX,2 MOV WORD PTR DS:[BX+DATA1],7C77H ADD BX,2 MOV WORD PTR DS:[BX+DATA1],5E39H ADD BX,2 MOV WORD PTR DS:[BX+DATA1],7179H ADD BX,2 MOV WORD PTR DS:[BX+DATA1],003FH ;"SPEED 0" ADD BX,2 MOV WORD PTR DS:[BX+DATA1],5E00H ADD BX,2 MOV WORD PTR DS:[BX+DATA1],7979H ADD BX,2 MOV WORD PTR DS:[BX+DATA1],6D73H ADD BX,2 RET LEDDISP: MOV AL,90H MOV DX,CONTPORT OUT DX,AL MOV BYTE PTR DS:[DATA3],00H LED1: CMP BYTE PTR DS:[DATA3],07H JA LED2 MOV BL,DS:[DATA3] MOV BH,0H MOV AL,CS:[BX+DATA2] MOV DX,DATAPORT OUT DX,AL ADD BYTE PTR DS:[DATA3],01H JNZ LED1 LED2: RET CONVERS1: MOV BH,0H AND AX,0FH MOV BL,AL MOV AL,CS:[BX+DATA1] RET CONVERS: PUSH AX CALL CONVERS1 MOV SI,DATA2 MOV DS:[SI],AL INC SI POP AX MOV CL,4H SHR AX,CL PUSH AX CALL CONVERS1 MOV DS:[SI],AL INC SI POP AX MOV CL,4H SHR AX,CL CALL CONVERS1 MOV DS:[SI],AL RET BCDCON: AND AX,0FFH MOV CX,AX MOV AL,0 BCDCON1: ADD AL,1 DAA JNC NEXT ADD AH,1 NEXT: LOOP BCDCON1 RET CODE ENDS END START
为什么这程序没有显示结果,功能是双字左移然后显示?
CALL MOVING; POP AXMOV DX,AXCALL DISPMOV AH,4CHINT 21HMOVING PROC NEARSHL DX,CLMOV BL,AHSHL AX,CLPUSH AXSHR BL,CLOR DL,BLCALL DISPpop ax ;这里出问题了 返回的是AX里的值RET
转载请注明出处51数据库 » call word ptr