三九宝宝网宝宝教育教学论文

编写汇编语言程序用8086指令实现两个32位无符号数相加

02月25日 编辑 39baobao.com

[用有符号数实现排序的汇编语言程序]DSEG SEGMENT n equ 5 buf db n dup(?) DSEG ENDS CSEG SEGMENT assume cs:CSEG, ds:DSEG MAIN PROC FAR ;主程序入口 mov ax, dseg mov ds, ax mov cx,n dec cx loop1: mov...+阅读

assume cs:cseg

cseg segment

hextab db '0123456789ABCDEF'

A dd 11118888H

b dd 33339444H

c dd 0

start:

mov ax, cseg

mov ds, ax

mov ax, word ptr a

add ax, word ptr b

mov word ptr c, ax

mov ax, word ptr a+2

adc ax, word ptr b+2

mov word ptr c+2, ax

;16进制显示结果

lea bx, hextab

mov ah, 0eh

;高16位

mov dx, word ptr c+2

mov cx, 404h

c1:

rol dx, cl

mov al, dl

and al, 0fh

xlat

int 10h

dec ch

jnz c1

;低16位

mov dx, word ptr c

mov cx, 404h

c2:

rol dx, cl

mov al, dl

and al, 0fh

xlat

int 10h

dec ch

jnz c2

mov ah,4ch

int 21h

cseg ends

end start

汇编语言为什么还要学习 windows环境下32位汇编语言程序设

王爽书中的汇编语言,是16位实模式下的汇编语言。

罗云斌的书讲的是工作在32位环境下保护模式的汇编。

时至今日,传统的dos时代已经过去了。

很少应用程序还设计为工作在16位环境下。大部分都工作在32位环境下。

而16位和32位是两码事,16位中是调用各种中断完成功能,

但在32位保护模式中,这是非法指令,只能调用windwos系统提供的api而不能直接调用中断了。

32位环境的汇编的风格越来越接近c。

对于逆向而言,用16位的方法来反汇编32位,是不可行的。

同样,把32位程序反汇编结果以16位的方法来解也是不可行的。

在windows32下的逆向是必须掌握win32汇编。熟悉各种win32api,熟悉pe结构,熟悉脱壳,熟悉各种算法等等。

win32汇编只是学习逆向的基础,只会汇编不可能在逆向的路上走多远,还必须学习很多高级语言,和熟悉这些高级语言的反汇编形式和结构。

对于采用虚拟机的语言,则需要学习其虚拟机上运行的指令。

比如.net逆向,就必须掌握IL.

逆向很有趣,也很辛苦。希望lz坚持。

汇编语言程序设计

1、用减奇数法开平方。(算法:N个自然数中的奇数之和等于N的平方。) 程序清单:内存datum中存要开方数 ,result中存放结果 data segment datum db 16 result db 0 data ends ss_seg segment stack db 256 dup(?) ss_seg ends code segment assume cs:code,ss:ss_seg,ds:data main proc far push ds mov ax,0 push ax mov ax,data mov ds,ax mov al,datum mov bl,0 mov cl,1 loop1: sub al,cl inc bl inc cl inc cl cmp al,0 ja loop1 mov result,bl ret main endp code ends end main 实验结果:十六进制显示 16 为10h 结果为4

2、求一个长度为8的无符号字节序列中的最大值和最小值。

程序清单:(内存min 中存放最小值,max 中存放最大值) data segment buffer db 43,21,3,1,5,69,7,8 min db 0 max db 0 data ends ss_seg segment stack db 100 dup(?) ss_seg ends code segment assume cs:code,ds:data,ss:ss_seg 3.编程提要

(1)自己编写算法,将求得的平均分数的十进制值,转换成十进制表示。其算法是平均分数二进制的低4位>9则加6。对于高4位,将其值乘以16再与4位十进制调整的结果相加,即得到最终结果。

乘法可以用多次加法实现。

(2) 显示字符串信息用DOS功能调用INT21H,功能号为09H。 (3) 显示平均数结果时,用DOS功能调用INT21H,功能号为02H。每位数必顺将其转换成相应的ASC码。附:参考程序;******************************AVGSCORE.ASM******************************DATA SEGMENTMES1 DB 92,85,74,81,70,68,65,78,54,43 DB 94,100,83,88,79,83,79,69,62,60MES2 DW 92,85,74,81,70,68,65,78,54,43 DW 94,100,83,88,79,83,79,69,62,60;---------------------------------------------------------------------------MES3 DB 'AVERAGE$'DATA ENDS; ---------------------------------------------------------------------------CODE SEGMENTASSUME CS:CODE,DS:DATA;---------------------------------------------------------------------------START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES1 MOV AH,09H INT 21H ;显示提示信息;--------------------------------------------------------------------------- MOV BX,OFFSET MES2 MOV CL,20 MOV AX,0000NEXT: ADD AX,WORD PTR[BX] ;将各成绩累加求和 ADD BX,02 LOOP NEXT MOV CL,20 DIV CL ;求得平均成绩和二进制值 MOV DL,AL;--------------------------------------------------------------------------- AND AL,0F0H ;平均成绩的十进制调整 MOV CL,04 ROR AL,CL MOV CL,AL ;平均成绩高四位进进制值送入CL MOV AL,DL AND AL.0FH CMP AL,09 JBE HAD ADD AL,06 ; 平均成绩的低4位十进调整HAD: MOV BL,16H ; 平均成绩高位十进制调整NT: ADD AL,BL DAA MOV BH,AL ;平均成绩十进制值送入BH LOOP NT;--------------------------------------------------------------------------- MOV DX,OFFSET MES3 MOV AH,09H INT 21H ; 屏幕显示平均成绩提示符 MOV AL,BH AND AL,0F0H COM CH,04 ROR AL,CH ADD AL,30H MOV DL,AL MOV AH,02 INT 21H ; 显示平均成绩高位;--------------------------------------------------------------------------- MOV AL,BH AND AL,OFH ADD AL,30H MOV DL,AL MOV AH,02 INT 21H ; 显示平均成绩的低4位;--------------------------------------------------------------------------- MOV AX.4C00H INT 21H ; 返回DOSCODE ENDSEND START

以下为关联文档:

C语言定义一个函数实现两个集合的相加运算#include #include #include #define N 7 typedef enum { add, nul, sub, div1, yu, l, r }OP; int a[N][N] = { { 0, 0, -1, -1, -1, 1, 2 }, { 0, 0, -1, -1, -1, 1, 2 },...

怎么做啊?!二编程题 1用汇编语言编写程序编程实现以下功stud struc name db ' ' eng db ?math db ?comp db ?phy db ?sum dw ?aver db ?stud ends code segment assume cs:code org 100h start:jmp bbb studs studstudstudstudbbb...

求用汇编语言写 2个32位有符号数乘法的程序我承认程序不是我写的~是小文写的~不过分数我代领了~哈哈哈哈哈 assume cs:code,ds:data data segment NA dw 0F321H,09AFCH NB dw 08818H,0301DH ;-------第一个字是等待相...

用汇编语言编写程序;MIMA ;================================== DATA SEGMENT BUF1 DB 'HAPPY!' BUF3 DB 10, 13, 'PLEASE INPUT PASSWORD : $' BUF4 DB 10, 13, 'ERROR ! $' BUF5 DB 6 DUP(?)...

用完整的8086汇编语言程序格式实现以下过程data segment buf db 3,5,-3,0,2,-8,1,-4,-9,-18 n equ $-buf count db ? data ends code segment assume cs:code,ds:data start: mov ax,seg data mov ds,ax lea si,buf m...

用c语言编写一个程序实现以下功能1 2 3 4 5 6 7 8 9 10 #include "stdio.h" intmain(intargc,char*argv[]){ 5261int a,b; doublex,y; charch1,ch2; printf("Please enter the data...\n"); scanf("%d%d%lf%lf %c...

求一个程序微机原理 8086汇编语言实现一个简单实用功能如时;求一个程序,微机原理,8086汇编语言,实现一个简单实用功能,如时钟显示 ; ;在右上角显示时钟,按任一键结束 ;用MASM5.0编译通过. data segment HH DB 0,0,':' MM DB 0,0,':' SS1 DB 0...

用汇编语言乘法指令实现两个字节相乘的程序并转换成十六进制数显示code segment assume cs:code org 100h start: jmp bbb x db 11h y db 12h z dw ? msg1 db 13,10,' ','$' bbb: push cs pop ds push cs pop es mov al,x mov bl,y mul bl m...

编写程序用函数实现对10个整数的冒泡排序c语言#include <stdio.h> void main() { int a[10]; int i,j,t,flag; printf("input 10 numbers :\n"); for (i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<9;j++) for(i...

推荐阅读
图文推荐