汇编语言指令及几个例题
汇编语言指令练习.doc
填空1、已有AX=E896H,BX=3976H,若执行ADD BX,AX指令,则结果BX,AX,标志位CF,OF,ZF各为何值?2、源程序如下:MOV CL,4MOV AX,[2000H]SHL AL,CLSHR AX,CLMOV [2000H],AX试问:若程序执行前,数据段内(2000H)=09H,(2001H)=03H, 则执行后有(2000H)=_____,(2001H)=______。
3、源程序如下:(4分)MOV AL,0B7HAND AL,0DDHXOR AL,81HOR AL,33HJP LAB1JMP LAB2试问: 执行程序后AL=_______;程序将转到哪一个地址执行:__________。
4、源程序如下:(6分)MOV CX,9MOV AL,01HMOV SI,1000HNEXT:MOV [SI],ALINC SISHL AL,1LOOP NEXT试问:执行本程序后有:AL=_____;SI=______;CX=______;选择1、判断下列指令的对错(正确的在括号内打“√”,错的打“⨯”) (5分)(1) LEA SI, 4[SI] ( )(2) MOV AL, [CX] ( )(3) XCHG [SI], [BX] ( )(4) PUSH WORD PTR[BX] ( )(5) POP CS ( )2、将累加器AX的内容清零的不正确操作是()。
A. AND AX,0B. XOR AX,AXC. SUB AX,AXD. CMP AX,AX3、设SS=2010H,SP=0086H,BX=6521H,当执行PUSH BX指令后,6521H在堆栈内的实际地址是()。
A. (20186H)=21H (20185H)=65HB. (20186H)=65H (20187H)=21HC. (20185H)=21H (20184H)=65HD. (20185H)=65H (20184H)=21H4、执行PUSH AX指令后,堆栈指针SP的内容()A.减1B. 减2C. 加1D. 加25、下面对PUSH指令描述正确的是()。
汇编命令
例题:(对错混合)1.IN AL,205H (×) 7.MOV AX,55AAH2.IN AX,20H MOV DX,3FCH3.IN AL,25H OUT [DX],AX4.IN AH,0FFH (×) 8.MOV AH,865.MOV DX,2050H OUT 25H,AH (×)OUT DX,AL 9.IN AL,25H6.MOV DX,2050H MOV BL,ALIN BX,DX (×)IN AL,36H(OUT DX,BX ) (×) MOV BH,AL……例题:(对错混排)ADD AL,25H ADD BYTE PTR[BX],05ADD AL,125H ADD WORD PTR[BX],05ADD AX,2500H ADD [BX],2050HADD AX,05 ADD AL,BLADD [BX],05 ADD CH,DLADD BH,CX ADD AX,DXADD SI,BP ADD BX,[BX+SI]ADD DX,[BX+DI] ADD AX,[BX+BP]ADD AX,[SI+DI] ADD [BP+DI+205H],ALADD [BP+SI],CX ADD [BX],[SI+05H]INC 25H INC ALINC CX INC [BX+SI]INC BYTE PTR[BX+SI] INC WORE PTR[BX+DI+25]全部是错的①MOV CX,DL 类型不匹配⑤mov ES,DS 两个段寄存器不能相互转送②mov IP,AX ip不被用户访问⑥mov [SP],AX MOV [SI],AX才对只有BX,BP,SI,DI才满足③mov ES,1234H立即数不能送与段寄存器⑦mov AX,BX+DI MOV ax,bx / add ax ,di④mov AL,300 类型不匹配⑧mov 20H,AL 立即数不能做目的操作数①xchg [si],30h 必须要有一个寄存器⑤adc ax,ds 段寄存器不参与运算②pop cs cs不能出栈可进栈⑥add [si],80h 存储器的类型不能由另一个操作数确定③sub [si],[di] 两个操作数不能同时为内存⑦in al,3fch 类型不匹配④push ah 进栈出栈只能M16,R16⑧out dx,ah in 和out必须要AX,AL求解:给定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,试确定在以下各种寻址方式下的有效地址是什么?(1)立即数寻址的有效地址是当前IP的内容;(2)直接寻址,若使用位移量D=3237H进行,则有效地址为3237H;(3)使用BX的寄存器寻址时,操作数在BX寄存器中,因此无有效地址;(4)使用BX的间接寻址时,有效地址在BX寄存器中,即有效地址=637DH;(5)使用BX的寄存器相对寻址的有效地址=(BX)+D=637DH+3237H=95B4H;(6)基址变址寻址的有效地址=(BX)+(SI)=637DH+2A9BH=8E18H2.4.2 条件转移指令1.判断单个状态标志助记符标志说明JZ/JE ZF=1 结果为0;两数相等JNZ/JNE ZF=0 不为0;不相等JC/JB/JNAE CF=1 加有进位;减有借位;其他JNC/JNB/JAE CF=0 无进位;无借位;其他JS SF=1 结果为负JNS SF=0 结果为正JP/JPE PF=1 结果的低8位含偶数个“1”JNP/JPO PF=0 结果的低8位含奇数个“1”JO OF=1 运算结果溢出JNO OF=0 运算结果不溢出★JCXZ ( CX=0)串操作是否处理完所有2.比较无符号数高低(条件为一个标志或标志组合)助记符标志说明JB/JNAE/JC CF=1 低于/不高于不等于(<)JNB/JAE/JNC CF=0 不低于/高于或等于(≥)JBE/JNA CF=1或ZF=1 低于或等于/不高于(≤) JNBE/JA CF=0且ZF=0 不低于不等于/高于(>) 3.比较有符号数大小(条件为标志组合)助记符标志说明JL/JNGE SF≠OF 小于/不大于且不等于(<) JNL/JGE SF=OF 不小于/大于或等于 (≥) JLE/JNG SF≠OF或ZF=1 小于或等于/不大于 (≤) JNLE/JG SF=OF且ZF=0 不小于且不等于/大于(>)2.4.3 循环控制指令LOOP label ;CX≠0,循环;否则退出LOOPZ/LOOPF label;CX≠0 且 ZF=1,循环;否则退出LOOPNZ/LOOPNE label;CX≠0 且 ZF=0,循环;否则退出2.4.4 子程序调用及返回指令CALL near ptr label ;段内直接调用CALL r16/word ptr m16 ;段内间接调用CALL far ptr label ;段间直接调用CALL dword ptr mem ;段间间接调用RETRET i16。
汇编语言指令练习
汇编语言指令练习汇编语言是一种低级计算机语言,用于编写机器指令。
它主要用于底层系统开发和对硬件进行操作。
在学习和使用汇编语言时,熟悉各种指令非常重要。
本文将向你介绍一些常见的汇编语言指令,并提供一些练习来帮助你熟练掌握它们。
1. 数据传送指令数据传送指令用于将数据从一个地方传送到另一个地方。
常见的数据传送指令有:MOV(将数据从一个位置移动到另一个位置)、XCHG(交换两个位置的数据)等。
练习一:编写一个汇编程序,将寄存器AX中的数据传送到寄存器BX中。
2. 算数运算指令算数运算指令用于执行各种算术运算,如加法、减法、乘法和除法等。
常见的算数运算指令有:ADD(加法)、SUB(减法)、MUL (乘法)和DIV(除法)等。
练习二:编写一个汇编程序,将寄存器AX和寄存器BX中的数据相加,并将结果存储在寄存器CX中。
3. 逻辑运算指令逻辑运算指令用于执行逻辑运算,如与、或、非和异或等。
常见的逻辑运算指令有:AND(与运算)、OR(或运算)、NOT(非运算)和XOR(异或运算)等。
练习三:编写一个汇编程序,对寄存器AX中的数据进行逻辑非运算,并将结果存储在寄存器BX中。
4. 条件判断和跳转指令条件判断和跳转指令用于根据条件来执行不同的操作,并改变程序的执行流程。
常见的条件判断和跳转指令有:CMP(比较)、JE(相等时跳转)、JNE(不相等时跳转)等。
练习四:编写一个汇编程序,比较寄存器AX和寄存器BX中的数据,如果相等则跳转到标签“EQUAL”,否则跳转到标签“UNEQUAL”。
5. 函数调用指令函数调用指令用于调用和返回函数,实现程序的模块化设计。
常见的函数调用指令有:CALL(调用函数)和RET(返回函数)等。
练习五:编写一个汇编程序,调用一个名为“add”的函数,该函数将寄存器AX和寄存器BX中的数据相加,并将结果存储在寄存器CX中。
以上是一些常见的汇编语言指令及相应的练习。
通过反复练习这些指令,你将能够更好地理解和掌握汇编语言的编程技巧。
单片机汇编语言经典一百例
单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。
在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。
本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。
1. 点亮LED灯```ORG 0x0000 ; 程序起始地址MOV P1, #0xAA ; P1口输出高电平,LED灯点亮END ; 程序结束```2. LED流水灯效果```ORG 0x0000 ; 程序起始地址MOV P1, #0x01 ; P1口输出低电平,第一个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x02 ; P1口输出低电平,第二个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x04 ; P1口输出低电平,第三个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x08 ; P1口输出低电平,第四个LED点亮CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```3. 数码管动态扫描显示```ORG 0x0000 ; 程序起始地址CLR P0.0 ; P0.0口输出低电平,选择第一个数码管MOV P2, #0x7E ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.1 ; P0.1口输出低电平,选择第二个数码管MOV P2, #0x30 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.2 ; P0.2口输出低电平,选择第三个数码管MOV P2, #0x6D ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.3 ; P0.3口输出低电平,选择第四个数码管MOV P2, #0x79 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。
汇编语言典型例子详解汇编语言例子
汇编语言典型例子详解汇编语言例子汇编语言典型例子详解汇编语言是一种底层的编程语言,用于与计算机硬件进行交互和控制。
在计算机科学领域,学习汇编语言例子可以帮助我们深入了解计算机的工作原理和底层运行机制。
本文将详细解析几个典型的汇编语言例子,帮助读者更好地理解和掌握汇编语言编程。
1.加法运算的例子假设我们需要编写一个汇编语言程序来实现两个数字的加法运算。
以下是一个典型的汇编语言例子:```assemblysection .datanum1 db 5num2 db 3result db 0section .textglobal _start_start:mov al, [num1] ; 将num1的值加载到寄存器al中add al, [num2] ; 将num2的值与al中的值相加mov [result], al ; 将结果保存到result中; 输出结果到屏幕mov ah, 0x0E ; 设置打印字符的功能码mov al, [result] ; 将结果加载到al寄存器中add al, 30h ; 将结果加上字符'0'的ASCII码,使其变为可打印字符 int 10h ; 调用BIOS中断打印结果; 退出程序mov eax, 1 ; 设置退出系统调用号int 0x80 ; 调用系统调用中断退出程序```上述例子使用了汇编语言的指令和寄存器来完成加法运算,并将结果保存到result变量中。
最后,通过BIOS中断调用将结果打印到屏幕上,并使用系统调用中断退出程序。
2.循环控制的例子下面是一个使用汇编语言编写的简单循环控制的例子:```assemblysection .datacount db 10 ; 循环次数sum db 0 ; 计数器section .textglobal _start_start:xor rcx, rcx ; 清零计数寄存器rcxloop_start:cmp cl, [count] ; 比较计数寄存器和循环次数je loop_end ; 若相等,跳转到循环结束add cl, 1 ; 计数器自增1add [sum], cl ; 将计数器的值加到sum中jmp loop_start ; 无条件跳转到循环开始loop_end:; 输出结果到屏幕mov ah, 0x0E ; 设置打印字符的功能码mov al, [sum] ; 将sum加载到al寄存器中add al, 30h ; 将结果加上字符'0'的ASCII码,使其变为可打印字符 int 10h ; 调用BIOS中断打印结果; 退出程序mov eax, 1 ; 设置退出系统调用号int 0x80 ; 调用系统调用中断退出程序```上述例子使用了循环控制指令来实现对计数器和循环次数的操作。
汇编语言代码例子
汇编语言代码例子汇编语言代码例子是指使用汇编语言编写的代码,它是机器语言的一种表示形式,主要用于编写计算机的低级程序,而不是用于创建高级程序。
汇编语言的特点是可以迅速地将机器指令转换为机器代码,并且可以编写出非常高效的程序,也就是所谓的“驱动程序”,它们能够直接控制计算机硬件,如CPU、内存和磁盘。
汇编语言代码例子包括:1. MOV 命令。
MOV 是移动指令,是把某个寄存器中的值移动到另一个寄存器中,或者把内存地址中的值移动到寄存器中,如:mov ax, bx 将bx中的值移动到ax中。
2. ADD 命令。
ADD 是加法指令,是把某个寄存器中的值和另一个寄存器中的值相加,或者把内存地址中的值和寄存器中的值相加,如:add ax, bx 将bx中的值和ax中的值相加。
3. SUB 命令。
SUB 是减法指令,是把某个寄存器中的值和另一个寄存器中的值相减,或者把内存地址中的值和寄存器中的值相减,如:sub ax, bx 将bx中的值从ax中减去。
4. MUL 命令。
MUL 是乘法指令,是把某个寄存器中的值和另一个寄存器中的值相乘,或者把内存地址中的值和寄存器中的值相乘,如:mul ax, bx 将bx中的值和ax中的值相乘。
5. DIV 命令。
DIV 是除法指令,是把某个寄存器中的值和另一个寄存器中的值相除,或者把内存地址中的值和寄存器中的值相除,如:div ax, bx 将bx中的值从ax中除去。
6. CMP 命令。
CMP 是比较指令,是把某个寄存器中的值和另一个寄存器中的值进行比较,或者把内存地址中的值和寄存器中的值进行比较,如:cmp ax, bx 将bx中的值和ax中的值进行比较。
7. JMP 命令。
JMP 是跳转指令,是根据条件跳转到指定的指令处执行,如:jmp label 跳转到“label”标记处执行。
8. CALL 命令。
CALL 是调用指令,是把子程序调用到当前程序中,如:call subroutine 调用名为“subroutine”的子程序。
汇编语言常用子程序
二、汇编语言常用子程序1、拆字与拼字:【例1】将 AX 中的四位 BCD 码从高到低依次存放到 CX所指的四个内存单元中。
【例2】将存放在CX所指的四个内存单元中的四位 BCD 码依从高到低顺序压缩到AX中。
2、数字与 ASCII 码之间的相互转换:十进制数字 0~9的 ASCII 码是 30H~39H ,所以只要将十进制数(BCD 码)加 30H 就是对应的 ASCII 码。
十六进制数转换成 ASCII 码可分成两段, 0~9的 ASCII 码是 30H~39H ,即加 30H ;A~F 的ASCII 码是 41H~45H ,即加 37 H。
【例1】将 AX中的四位 BCD 码化成 ASCII 码从高到低依次存放到字符串变量STR 中。
【例2】将AX中的 16 位二进制数化成四位十六进制数 ASCII 码从高到低依次存放到字符串变量 STR 中。
【例3】将字符串 STR 中的四位十六进制数的 ASCII 码化成 16 位二进制数放到AX中。
3、利用加减法及移位指令做乘法:1)左移指令可将操作数乘 2 的整数次方(2、4、8、16);右移指令可将操作数除以 2 的整数次方。
若操作数是无符号数,用逻辑移位指令;若操作数是有符号数,用算术移位指令。
【例1】将AX中的二进制数乘以 8。
【例2】将AX中的带符号二进制数除以 4。
2)将移位指令和加减法结合起来可完成乘数不是 2 的整数次方的乘法运算。
【例1】将AX中的二进制数乘以 10。
【例2】将AX中的二进制数乘以 7。
4、二进制数与十进制数的转换1)二化十:将二进制数转换为十进制数的一种常用算法是将被转换的二进制数依次被 10i(对 16 位二进制数,i为 4、3、2、1、0)除,所得的商即为该十进制数位的值,其余数再被下一个 10i 除。
一般用减法代替除法,即一边减 10i,一边计数器加 1,直到不够减再进行下一位 10i-1。
以求得十进制数的各位数。
《汇编语言》作业和主要例题
*教材:机械工业出版社主编《80x86汇编语言程序设计》第2版•马力妮CH1思考题:1-2、7-8、12、14【1.1】填空题(1)把汇编语言源程序转换为相应的目标程序的翻译程序称为(),这个翻译过程称为()。
(2)汇编语言源程序经()后,形成目标文件,再经()后,形成可执行文件。
(3)()是计算机中表示信息的最小单位,8位二进制数为一个(),而()是在操作中作为一个单元处理的一组数据。
(4)BCD码有两种存储方式:()和()。
(5)8位二进制的无符号数可表示的最大范围为()。
8位二进制的带符号数可表示的最大范围为()。
【1.2】选择题(1)下面各8位二进制数的补码中,绝对值对小的是()A. 01111111B. 10000001C. 01101101D.11111111(2)补码11001000表示的十进制真值是( )A. 200B. –200C. –56D. -184(3)16位带符号数所能表示的范围是( )A.–32767~+32768B.0~65535C.-65535~+65536D.-32768~+32767(4)与100.5不相等的数据是()A. 64.8HB. 1100100.1BC. 64.5HD. 144.4Q(5)将目标程序转换为可执行程序的是()A. 编辑程序B. 汇编程序C. 连接程序D.调试程序【1.7】将下列二进制数转换为十六进制数和十进制数。
(1)101011 B(2)11010011B (3)10110101B (4)1101100B【1.8】将下列十六进制数转换为二进制数和十进制数。
(1)2DH (2)1512H (3)1C5H (4)21F0H【1.12】将下列十进制数分别用组合型BCD码和非组合型BCD码表示。
(1)35 (2)74 (3)98 (4)14【1.14】有一个8位的数值00110101,回答问题:(1)如果它是一个二进制数,它表示的十进制数是多少?(2)如果它是BCD码,它表示的数是什么?(3)如果它是ASCII码,它表示的字符是什么?CH2思考题:1-3、6--9、11-12、16书面题:10、13-15【2.1】填空题(1)微型计算机硬件系统结构主要是由三部分组成,它们是()、()、()。
汇编语言典型例题
汇编语言典型例题汇编语言是一种底层的编程语言,它直接操作计算机硬件,并且与特定的计算机体系结构密切相关。
本文将介绍一些汇编语言的典型例题,帮助读者更好地理解和掌握这门编程语言。
例题一:计算两个数的和要求:编写一段汇编语言程序,计算两个32位有符号整数的和,并将结果存储在一个指定的寄存器中。
解决方案:```assemblysection .datanum1 dd 10num2 dd 20sum dd 0section .textglobal _start_start:mov eax, [num1]add eax, [num2]mov [sum], eax; 以下为输出结果的代码,具体实现方式与平台相关,这里不做详细展示...```例题二:判断一个数是否为负数要求:编写一段汇编语言程序,判断一个16位有符号整数是否为负数,如果是负数,则将其变为正数。
解决方案:```assemblysection .datanum dw -10section .textglobal _start_start:mov ax, [num]cmp ax, 0jnl positiveneg axpositive:; 此处可添加自定义逻辑,对正数进行处理; 以下为输出结果的代码...```例题三:字符串反转要求:编写一段汇编语言程序,将一个以0结尾的字符串进行反转,并输出反转后的字符串。
解决方案:```assemblysection .datastr db 'Hello, World!', 0len equ $ - strsection .textglobal _start_start:mov ecx, len - 1mov esi, 0mov edi, ecxreverse_loop:cmp esi, edijge print_reversemov al, [str+esi]mov ah, [str+edi]mov [str+esi], ahmov [str+edi], alinc esidec edijmp reverse_loopprint_reverse:; 以下为输出结果的代码...```通过以上例题的介绍,希望读者能对汇编语言的基本应用有一定的了解和掌握。
20个简单汇编语言程序 -回复
20个简单汇编语言程序-回复在编写这篇文章之前,让我们先了解一下什么是汇编语言。
汇编语言是一种底层的计算机语言,与机器语言非常接近。
它使用特定的助记符和指令来编写计算机程序。
汇编语言程序由一系列指令组成,这些指令告诉计算机执行特定的操作。
现在,让我们来看看以下的20个简单汇编语言程序,并逐个回答它们的功能和用途。
1. [求两个数的和]这个简单的汇编语言程序用于计算并打印两个输入数字的和。
它将两个输入的数字存储在寄存器中,并使用加法指令将它们相加。
2. [判断一个数是奇数还是偶数]这个汇编语言程序通过使用位操作和逻辑运算来判断一个输入数字是奇数还是偶数,并将结果打印出来。
它使用与运算指令来检查数字的最低位。
3. [计算一个数的阶乘]这个汇编语言程序用于计算并打印一个输入数字的阶乘。
它使用循环来连续乘以该数字的前一个数字,直到计算到1。
4. [求两个数的最大公约数]这个简单的汇编语言程序用于计算两个输入数字的最大公约数,并将结果打印出来。
它使用辗转相除法来找到最大公约数。
5. [判断一个数是素数还是合数]这个汇编语言程序通过使用循环和条件判断来判断一个输入数字是素数还是合数,并将结果打印出来。
它将该数字除以从2到它的平方根的所有数字。
6. [计算一个数的平方根]这个简单的汇编语言程序用于计算并打印一个输入数字的平方根。
它使用二分法逼近来找到平方根。
7. [将一个字符串反转]这个汇编语言程序用于将输入的字符串反转,并将结果打印出来。
它使用循环和临时寄存器来交换字符串中的字符。
8. [从一个字符串中查找子串]这个汇编语言程序用于在输入的字符串中查找子串,并将结果打印出来。
它使用循环和条件判断来逐个比较字符串的字符。
9. [将一个字符串转换为大写]这个简单的汇编语言程序用于将输入的字符串转换为大写,并将结果打印出来。
它使用循环和位操作来进行字符的转换。
10. [将一个字符串转换为小写]这个汇编语言程序用于将输入的字符串转换为小写,并将结果打印出来。
汇编语言指令及几个例题
1· 数据传送指令
一.通用数据传送指令 1.MOV
对于MOV指令来说需要注意一下几点: a:立即数不能作为目的操作数。例如: MOV 5 ,BX b:立即数不能送段寄存器(ES(附加段),SS(堆栈 段),DS(数据段),CS(代码段)) 例如:MOV ES,1234H c:目标寄存器不能为CS(因为在汇编语言中代码段是默认的 如P91页的此类程序)例如:MOV CS,BX d:两个段寄存器之间不能直接传送 例如:MOV ES,DS
• 7.已知 • AX=0A33AH,DX=0F0F0H • AND AH,DL //AH =A3H,DL=F0H功能AH 高四位不变,低四位清零得到AH=A0H • XOR AL,DH //AL=3AH=00111010B,DH=F0H.高四位 取反,低四位不变AL=CFH=11001010B • NEG AH //AH=0-AH= • 0-10100000=01100000B • NOT AL //AL 按位取反AL=00110101B • 上述指令执行后AH=60H,AL=35H.
• • • • •
MOV AL,25 MOV BL,20 MUL BL 除法也是如此。 带符号数乘除法方法是一样,只是要考虑符号而已。例如 教材71页第10题:设(AL)=96H,(BL)=12H,分别 执行MUL BL和IMUL BL指令后AX的值? • 对于无符号数乘法只需先将96H和12H换成十进制然 后相乘即可。96H=150,12H=18。二者的积为2700用16 进制表示为0A8CH。如果是有符号数乘法那么98H代表 的就不是150。96H的二进制表示为10010110B因为符号 位是1所以是负数而负数的表示为其补码(负数的补码:符 号位不变,按位取反,末尾加一)所以要得到96H真正表 示的负数。步骤如下:第一步:符号位不变,末尾减一得 到10010101B • 第二步:符号位不变,按位取反得到11101010B所以 96H代表的数是 • -106。所以乘积为-1908表示为0F8CH。
汇编语言test1
汇编语⾔test1汇编语⾔1⼀、简答题1.下⾯程序段执⾏后,寄存器BX的值发⽣什么变化?(不考虑溢出)SAL BX,1PUSH BXMOV CL,4SAL BX,CLPOP CXSUB BX,CX乘以 30d2.对于这样的程序段:CMP AX,BXJGE NEXTXCHG AX,BXNEXT: CMP AX,CXJGE DONEXCHG AX,CXDONE: ┆试回答:①上述程序执⾏后,原有AX,BX,CX中最⼤数存放在哪个寄存器?AX②这三个数是带符号数还是⽆符号数?G,所以是有符号数3.已知寄存器(DS)=1000H,(SS)=1110H,(BX)=100H,(BP)=100H,(SI)=0002H,(SP)=100H;内存单元中的(10100H)=12H,(10101H)=34H,(10102H)=56H,(10103H)=78H,(11200H)=0ABH,(11201H)=0CDH,(11202H)=0EFH,(11203H)=0D3H。
试说明下列各指令执⾏完后AX寄存器的内容。
指令(写个思路,其他⾃⼰搞) AX的内容① MOV AX,1200H ① 1200(直接给)② MOV AX,BX ② 0100h③ MOV AX,[1200H] ds:1200(10000+1200=11200)③所以读(11201和11200内容)0CDABH④ MOV AX,[B P] BP:找SS:bp 11100+100=11200同理读11201和11200内容⑤ MOV AX,1100H[BX] [BX]:找 ds:1100+bx ⑤⑥ MOV AX,[BX][SI] ds:bx+si ⑥⑦ MOV AX,1100H[BX][SI] ds:bx+si+1100 ⑦⑧ POP AX ss:sp⑧4. A DB 0F8HB DB 3 DUP(?)┇LEA DI,BMOV CX,3MOV AL,ALOP:SAR AL,1MOV [DI],ALINC DILOOP LOPOFCH OFEH OFFH上述程序段运⾏后,从B单元开始依次存放的数据是多少?5.执⾏下⾯的程序段后,AX和BX寄存器的内容各是多少?MOV AX,1MOV BX,23MOV SI,10XCHG AX,BXMUL SIADD BX,AXAX=230 BX=231⼆、程序填空题下⾯是⼀个.com⽂件格式的程序,完成从键盘上输⼊⼀个4位以内的16进制数,并以10进制形式显⽰出来。
汇编语言指令及几个例题分析解析
•
对于无符号数乘法只需先将96H和12H换成十进制然
后相乘即可。96H=150,12H=18。二者的积为2700用16进
制表示为0A8CH。如果是有符号数乘法那么98H代表的就
不是150。96H的二进制表示为10010110B因为符号位是1
所以是负数而负数的表示为其补码(负数的补码:符号位
不变,按位取反,末尾加一)所以要得到96H真正表示的
汇编语言常用指令总结
1·数据传送指令
一.通用数据传送指令 1.MOV
对于MOV指令来说需要注意一下几点: a:立即数不能作为目的操作数。例如:
MOV 5 ,BX b:立即数不能送段寄存器(ES(附加段),SS(堆栈
段),DS(数据段),CS(代码段)) 例如:MOV ES,1234H c:目标寄存器不能为CS(因为在汇编语言中代码段是默认的
•
特别注意的是,乘除法指令不能直接与立即数想乘
除。例如要实现25乘以20的无符号乘法功能
•
MOV AL,25
•
MOV 20
• 上面的第二条指令时错误的。正确的语句应该是:
• MOV AL,25
• MOV BL,20
• MUL BL
• 除法也是如此。
• 带符号数乘除法方法是一样,只是要考虑符号而已。例如 教材71页第10题:设(AL)=96H,(BL)=12H,分别 执行MUL BL和IMUL BL指令后AX的值?
现在最高位。例如将10001000B逻辑右移一位得到
01000100B
•
但是将其算术右移一位得到11000100B,也就是说在
逻辑右移过程中移入位为0,而算术右移过程中移入位与
最高位相同
• 位操作指令 • 指令(按位取反) • AND指令 • XOR指令 • OR指令 • TEST指令
汇编语言常用指令
汇编语言常用指令(1)数据传送指令:Mov mem,ac将ac中的数值传送到mem中,如: Mov Ax, 6BH,意思将十六进制数6B放到Ax中(2)XCHG AX,BX数据交换指令,将Ax与Bx数据交换,指令执行前:AX=420AH BX=7955H,指令执行后:AX=7955H, BX=420AH(3)LEA REG,SRC将SRC的有效地址送到REG中(4)ADD加法指令ADD AH,BH指令执行前:AH=56H, BH=24H,指令执行后:7AH01010110 AH00100100 BH________________01111010 AH(5)ADC加法指令ADC加法指令与ADD很相似,不同的是会再加上进位标志符CF的值如:指令执行前:DX=0002H AX=F365H BX=0005H CX=E024H执行:ADD AX,CX1111 0011 0110 01011110 0000 00100100CF - 1 1101 0011 10001001执行:ADC DX,BX0000000000000010 DX0000000000000101 BX1CF000000000001000 DX(6)INC: 加1指令INC ALAL执行前为67H,指令执行后变为:68H(7)SUB:不带借位的减法指令SUB BX,7CX指令执行前:BX=9543H,CX=28AH1001 0101 01000011 BX0010 1000 10100111 CX0110 1100 10011100 BX(8)DEC:减1指令(与INC的含义相同)(9)MUL:乘法指令字节操作数:AX←AL*(SRC)字操作数:DX,AX←AX*(SRC)具体见2007年春试题81(10)DAA:加法的十进制调整指令见2006秋81题,如果AL的低四位或高四位的十六进制在A—F之间,则加6H(11)AAA:加法的Ascii调整指令如AL寄存器的低四位在十六进制A—F间或进位标志AF=1,则AL寄存器的内容加6,AH寄存器的内容加1,清除AL寄存器的高四位,见2005春81(12)AND:逻辑与指令,两个操作数都为1则为1AND AL,0FH指令执行前: AL=39H0011 1001 39H0000 1111 0FH0000 1001 AL(13)OR:逻辑或指令,两个操作数有一个为1则为1(14)XOR:逻辑异或指令,两个操作数必须一个为1,一个为0则为1(15)SHL:逻辑左移指令SHL DX,7指令执行前:DX=00101001 100100指令执行后: DX=110010000000000(16)SHR:逻辑右移指令SHR DX,7指令执行前:DX=00101001 1001000指令执行后: DX=0000000001010011(17)SAL:算术左移指令,与SHL相同(18)SAR:算数右移指令,与SHR唯一不同的是,移动后符号位保持不变见2008春81(19)ROL:循环左移ROL AL,3指令执行前:AL=0010 1000指令执行后:AL=0000 0101(20)ROR:循环右移(21)LOOPNZ:循环指令,循环一次则CX-1,i循环结束条件为CX=0(22)EQU:赋值指令,A EQU 5表示将5赋值给A(23)DB:定义字节,其后的操作数占有一个字节单元DW:定义字,其后的操作数占有一个字单元DD:定义双字,其后的操作数占有两个字单元(24)$:这个符号表示取当前地址(25) AAM:该指令是用于调整寄存器AL之值, 该值是由二个单BCD码字节用无符号乘指令MUL所得的积。
汇编语言大题1
汇编语⾔⼤题11.6若机器字长为16位,其⽆符号数表⽰范围是多少?带符号数表⽰范围是多少?分别⽤⼗进制和⼗六进制表⽰。
答:⽆符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH1.9 写出下列算式的⼆进制运算结果,标志位CF、SF、ZF、OF分别是什么值?答:(1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0(2) 83-45=00100110B,CF=1,SF=0,ZF=0,OF=0(3) -74+29=11010011B,CF=0,SF=1,ZF=0,OF=0(4) -92-37=01111111B,CF=1,SF=0,ZF=0,OF=12.9 8086CPU的地址线为20根,寻址空间为1MB。
最少可划分为多少个逻辑段?最多呢?答:最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节)2,18 已知堆栈区⼤⼩为512字节,栈底单元的物理地址为15230H。
将两个字⼊栈保存后,当前栈指针所指单元的物理地址是多少?堆栈区中还能保存多少个数据?答:当前栈指针所指单元的物理地址是1522CH。
堆栈区中还能保存254个字。
2.21 在DEBUG下,要将寄存器CX的值修改为100H,应该执⾏什么命令?答:执⾏R CX,然后输⼊1002.22 在DEBUG下,怎样将数据段的0号~4号字节单元填⼊'a'、'b'、'c'、'd'?答:执⾏E DS:0 ?a? ?b? ?c? ?d?3.8 根据题⽬要求,写出相应的汇编指令:(1)把BX寄存器的值传送给AX(2)将⽴即数15送⼊CL寄存器(3)⽤BX寄存器间接寻址⽅式将存储单元中的字与AX寄存器的值相加,结果在 AX中(4)把AL中的字节写⼊⽤基址变址寻址的存储单元中送⼊寄存器AX(6)将AX中的数与偏移地址为2000H存储单元的数相减,结果在AX中答:(1) MOV AX,BX (2) MOV CL,15 (3) ADD AX,[BX](4) MOV [BX+SI],AL (5) MOV AX,VALUE[SI](6) SUB AX,DS:[2000H]3.10 在数据寻址⽅式中,哪种寻址⽅式的操作数与指令⼀起存放在代码段?答:⽴即寻址⽅式中操作数(⽴即数)和指令⼀起存放在代码段中。
汇编语言典型例题
典型例题(与考试题型,考试范围相近)1.应用程序具有3个基本段,可执行指令应该保存于( A )。
A) 代码段 B) 数据段C) 堆栈段 D) 附加段2. 8位补码F3H要扩展成16位补码应该是( D ),这样其真值才不变。
A) F0F3H B) 00F3H C) 10F3H D) FFF3H3. “mov [ebx+8],eax”指令的目的操作数采用( C )寻址方式。
A) 存储器间接 B) 寄存器 C) 寄存器相对D) 立即数4. 执行“sar ebx,1”指令后,ebx最高D31位一定等于( D )A) 0 B) 1 C) D0位 D) D30位5. 在代码段内的-128~127个字节前后范围的跳转,可以用( C )类型名表示。
A) WORD B) DWORD C) SHORT D) FAR6. 在Windows控制台环境,在当前光标显示信息应该使用( B )函数(功能)。
A) ReadConsole B) WriteConsoleC) MessageBox D) GetStdHandle7.汇编语言源程序经汇编后不能直接生成( C )A) OBJ文件 B) LST文件 C) EXE文件 D) CRF文件8.在ADD指令中,两个操作数的物理位置不可以安排在( A )中。
A) 两个主存储单元B) 一个主存储单元和一个数据寄存器C) 两个数据寄存器D) 一个堆栈单元和一个数据寄存器9.假定ax=6987h,执行指令cmp ax,0eb30h后,则标志位CF和OF的状态( C )。
A)0,0 B) 0,1 C) 1,0 D) 1,110.假定esp=00120100h,eax=1f6c2107h,执行指令push ax后,存放数据07h的物理地址是( C )。
A) 00120104h B) 00120101h C) 001200fch D) 001200ffh11.下列对标志寄存器中标志位产生影响的指令是( B )A) jmp done B) shl eax, 2C) call subp D) not eax12. 假设CL=98H, 执行“MOVSX DX, CL”后,DX=( D )A) F098H B) 0098H C) 1098H D) FF98H13. “mov 80h[esi], eax”指令的目的操作数采用( C )寻址方式。
汇编语言程序例题
【例】试编写一程序计算以下表达式的值。
w=( v- (x * y +z -540 )) /x式中 x、y、z、 v 均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、 V中,结果存放在双字变量W之中,程序的流程图以以下图。
DATA SEGMENTX DW 200Y DW 100Z DW 3000V DW 10000W DW 2 DUP(?)DATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTMOV DS, AX;DATA→AXMOV AX, XIMUL Y;( X) * ( Y)→ DX: AXMOV CX, AXMOV BX, DX;(DX:AX)→(BX:CX)MOV AX, ZCWD;( Z)符号扩展ADD CX, AXADC BX, DX;( BX: CX) +( DX:AX)→( BX: CX)SUB CX, 540SBB BX, 0;(BX:CX)- 540→(BX:CX)MOV AX, VCWD;( V)符号扩展SUB AX, CXSBB DX, BXDX: AX);( DX: AX) - ( BX:CX)→(IDIV X;(DX:AX)/XMOV W, AX;商→WMOV W+2, DX ;余数 DX→W+2MOV AH, 4CHINT 21HCODE ENDS;退出DOS状态END START【例】已知某班学生的英语成绩按学号(从 1 开始)从小到大的次序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。
编写程序以下:DB 83,56,32,66,78,84NO DB 10ENGLIST DB ?DATA ENDSCODE SEGMENTASSUME DS: DATA, SS: STACK, CS:CODEBEGIN: MOV AX, DATAMOV DS, AXLEA BX, TABMOV AL, NODEL ALXLAT TABMOV ENGLISH, ALMOV AH, 4CHINT 21HCODE ENDSEND BEGIN【例】已知在内存中有一个字节单元 NUM,存有带符号数据,要求计算出它的绝对值后,放入 RESULT单元中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 3.DR1 DB 10H,30H • DR2 DW 10H DUP(0,2,DUP(2)) • .......... • MOV BL LENGTH DRI • MOV CL LENGTH DR2 • 执行该指令后BL=1,CL=10H
• 4.设AL,BL,CL中的内容均为76H • XOR AL,0FH//将AL低四位取反,高四位 不变AL=79H • AND BL,0FH //将BL高四位清零低四位不 变BL=06H • OR CL,0FH //将CL低四位置一,高四位不 变得到CL=7FH • 所以上述指令执行后AL=79H,BL=06H, CL=7FH
• • • • •
MOV AL,25 MOV BL,20 MUL BL 除法也是如此。 带符号数乘除法方法是一样,只是要考虑符号而已。例如 教材71页第10题:设(AL)=96H,(BL)=12H,分别 执行MUL BL和IMUL BL指令后AX的值? • 对于无符号数乘法只需先将96H和12H换成十进制然 后相乘即可。96H=150,12H=18。二者的积为2700用16 进制表示为0A8CH。如果是有符号数乘法那么98H代表 的就不是150。96H的二进制表示为10010110B因为符号 位是1所以是负数而负数的表示为其补码(负数的补码:符 号位不变,按位取反,末尾加一)所以要得到96H真正表 示的负数。步骤如下:第一步:符号位不变,末尾减一得 到10010101B • 第二步:符号位不变,按位取反得到11101010B所以 96H代表的数是 • -106。所以乘积为-1908表示为0F8CH。
汇编语言常用指令总结
1· 数据传送指令
一.通用数据传送指令 1.MOV
对于MOV指令来说需要注意一下几点: a:立即数不能作为目的操作数。例如: MOV 5 ,BX b:立即数不能送段寄存器(ES(附加段),SS(堆栈 段),DS(数据段),CS(代码段)) 例如:MOV ES,1234H c:目标寄存器不能为CS(因为在汇编语言中代码段是默认的 如P91页的此类程序)例如:MOV CS,BX d:两个段寄存器之间不能直接传送 例如:MOV ES,DS
• e:两个存储器操作数之间不能直接传送 • 例如MOV [AX],[BX] • f:在传送过程中要注意长度匹配 • 例如:MOV BL,AX • MOV CX,BL 二.堆栈操作指令 • a. 进栈指令PUSH • PUSH后的源操作数只能是16位的寄存器或存储器操作数。 例如: • PUSH AX • PUSH AL • PUSH [BX] •
• • • • • • • • • • • • •
d:类型转换指令(略) 三. 二进制指令 a:加法指令ADD ,带进位加法指令ADC。 ADD DST,SRC实现DST=DST+SRC ADC DST,SRC实现DST=DST+SRC+CF 减法指令SUB, 带进位减法指令SBB。 SUB DST,SRC实现DST=DST-SRC SBB DST,SRC实现DST=DST-SRC-CF 要特别注意的是源操作数和目的操作数的长度必须得匹配, 如ADD BX,AX 而ADD BL,AX 是错误的。其次段寄存器不能参加算术运算如: ADD ES,BX. b:INC,DEC,NEG等指令其中尤其注意NEG指令 NEG BX实现的是0-BX=BX
• 循环移位指令(略) 至于第二章中其他指令基本没有什么特别注意的地方,只 需按照书上的介绍使用就行了。
• • • • •
例题选讲: 1.设(SP)=100H,(AX)=0FFFFH STC //置CF=1 PUSH AX //将AX压入堆栈,SP=SP-2 ADC AX,0 //AX=AX+0+CF(CF=1) PUSH BX // 将BX压入堆栈,SP=SP-2 • POP BX //将SP所指向的内容弹出送到 BX中,SP=SP+2 • 上述程序执行后BX=0;SP=0FEH
• • • • • • • • • • •
•
Байду номын сангаас
POP AX POP BX 最后AX=9ABCH,BX=5678,SP=1FFEH c:地址传送指令LEA LEA REG,SRC 其中源操作数只能是存储器操作数即[?]型.例如: LEA BX,[BX] 这种指令主要在变成题较广: 例如:DATA SEGMENT DATA DW 10 DUP(?) DATA ENDS 这是一个定义了一个以DATA为首地址的10个字(20个字) 型的空间
• 5.写一段代码判断AL中的数是否为偶数, 若为偶数则执行AAA,否则执行BBB • 代码如下: • TEST AL,01H • JZ AAA • BBB
• • • • • • • •
6.假设数据段定义如下: DA1 DW 'C','D' DA2 DB 18 DUP(?) DA3 DW $-DA2 ....... MOV BX,DA3 MOV AX,DA1 执行上述指令后,BX=12H,AX=0043H (C的ASICII码)
• 8.期末考试编程题第一题; • 判断一个16进制数AX的二进制表示有多少 个1,若个数为偶数则置CF=1,否则CF=0; • ........ • MOV CX,15 MOV BX, 01H MOV BL, 0 LOOP:TEST AX,BX • JNZ • INC BL •
SAL BX,1 JMP LOOP TEST BL,01 JZ JMP NEXT STC NEXT:CLC ............
•
•
• •
• • • • • •
其中第二个是错误的,注意BX在这里代表的的是一个 地址[BX]代表的事这个地址中所存储的数。所以第三个指 令是将[BX]中的数压入堆栈,其中这个指令存在歧义。在 这里默认了[BX]是16位的。 指令在执行过程中时先将指针SP-2(即修改栈顶指针) 再将源操作数压入栈顶 b:出栈指令POP POP的源操作数要注意额地方和PUSH一样但是要特 别注意的是POP CS这条指令时错误的。 综合这两条指令在考题中以这种题型出现: 例如:AX=1234H, BX=5678H,CX=9ABCH,SP=2000H。 问执行下列指令后AX,BX中的值和SP=? PUSH AX PUSH BX PUSH CX
• 基本移位指令SHL,SAL,SHR,SAR • 基本格式SHL(SAL,SHR,SAR) DST,CNT • 注意当CNT=1时,可直接写1。如果CNT大于1,那么必 须用计数器CX表示移的位数。 • 如逻辑左移1位SHL AX,1。 • 逻辑右移4位正确指令为 • MOV CX,4 • SHR AX,CX • 需要特别注意的是逻辑左移SHL和算术左移SAL是没 有区别的。但是SAR和SHR有很大区别。这个却别主要体 现在最高位。例如将10001000B逻辑右移一位得到 01000100B • 但是将其算术右移一位得到11000100B,也就是说在 逻辑右移过程中移入位为0,而算术右移过程中移入位与 最高位相同
谢谢观赏! 祝大家新年快乐!
• 7.已知 • AX=0A33AH,DX=0F0F0H • AND AH,DL //AH =A3H,DL=F0H功能AH 高四位不变,低四位清零得到AH=A0H • XOR AL,DH //AL=3AH=00111010B,DH=F0H.高四位 取反,低四位不变AL=CFH=11001010B • NEG AH //AH=0-AH= • 0-10100000=01100000B • NOT AL //AL 按位取反AL=00110101B • 上述指令执行后AH=60H,AL=35H.
• 2.分析下面程序段 • MOV AL,200 //AL=200,二进制表示为 11001000B • SAR AL,1 //AL=11100100B=E4H • MOV BL,AL //BL=Al=E4H • MOV CL,2 //CL=2 • SAR AL,CL //AL=11111001B • ADD AL,BL //AL=11111001B+11100100B=1101110 1 • 注意在此处产生了溢出真实值为 111011101B但是AL只能装8位所以 AL=11011101B=0DDH • 执行该程序后BL=0E4H,AL=0DDH
• • • • • •
位操作指令 NOT指令(按位取反) AND指令 XOR指令 OR指令 TEST指令 其中AND指令主要用于对某位清零。如清零AL中的高 四位,低四位保持不变。正确指令为AND AL,0FH XOR指令主要用于将某位变反(与1异或),与0异或 保持不变;如将AL的高四位取反,低四位不变。正确的 指令为XOR AL,F0H。 OR指令主要用于将某位置一。如将AL中高四位置一, 低四位不变。正确指令为OR AL,F0H TEST指令主要用于检测某位是否为1。 如TEST AL,01H如果AL是奇数那么ZF=0
• 通过LEA AX,DATA • MOV DS,AX • 就可以将DATA的地址传送到DS的段基址中 • 同时,可以用SEG来获得起始地址,用OFFSET来获取偏 移地址。例如: • MOV SI,OFFSET DI • MOV BX,SEG DATA
• c:二进制乘除法指令 • 无符号乘法指令MUL,无符号除法指令DIV • 如果是字节型乘法(一个字节等于8位,如AL,BL等)那 么乘积放在AX中;如果是字型(一个字为两个字节)乘 法那么乘积在DS:AX中 • 无符号除法是如果是字节型除法那么商在AL中,余 数在AH中;如果是字型除法那么商在AX中,余数在DX中; • 特别注意的是,乘除法指令不能直接与立即数想乘除。 例如要实现25乘以20的无符号乘法功能 • MOV AL,25 • MOV 20 • 上面的第二条指令时错误的。正确的语句应该是: