实验4 汇编应用编程和c语言程序反汇编分析
2021-03-10 14:28
                         标签:包含   汇编代码   set   进入   字符串   offset   函数   c程序   调用    实验任务1 任务内容: 教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm!‘。 代码如下: 		mov ax,0b86eH s1:		push cx 		mov cx,16 		inc bx 		pop cx 		mov ax,4c00h 实验结果: 首先将字符串‘welcome to masm!‘存入内存 实验任务2 代码如下: assume cs:code, ds:data code segment     mov si, offset str     mov ah, 4ch printStr:     mov bx, 0b800H over:   pop di code ends 实验结果: ? 把line3改为: str db ‘another try‘, 0 把line12改为:mov al, 4 ? 在 line18-40中:line19-22, line36-39,在子程序的开始将子程序中所有用到的寄存器中的内容都用栈保存起来,在子程序返回前再恢复,line30的功能是设置字符颜色属性。 实验任务3 代码如下: assume cs:code, ds:data code segment         mov ah, 4ch num2str:         mov cx, 0         pop dx         ret 实验结果: 实验任务4 代码如下: assume cs:code, ds:data code segment s1:                 int 21h 实验结果: 实验任务5 在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。 代码如下: #include  int main() {     c = sum(a, b);     return 0; int sum(int x, int y) { 实验结果: 结果分析:从汇编角度分析反汇编代码可知,高级语言中参数传递和返回值是通过栈实现的。参数传递顺序:先将参数b入栈,再将参数a入栈,都是借助寄存器完成的。   实验4 汇编应用编程和c语言程序反汇编分析 标签:包含   汇编代码   set   进入   字符串   offset   函数   c程序   调用    原文地址:https://www.cnblogs.com/yfuyfyu/p/14151285.html
assume cs:code
data segment
  db ‘welcome to masm!‘
  db 2,36,113
data ends
code segment
start:
		mov ax,data
		mov ds,ax
		mov es,ax
		mov bx,0
		mov cx,3
		mov si,0
		mov di,64
s:		mov al,[si]
		mov es:[di],al
		mov al,[16+bx]
		mov es:[di+1],al
		inc si
		add di,2
		loop s
		mov ax,es
		add ax,0ah
		mov es,ax
		loop s1
        int 21h
code ends
end start
代码分析data段:
再计算出要求的颜色(绿色、绿底红色、白底蓝色)对应的颜色属性为2,36,113(10进制)
code段:
将data地址赋值给ds,用于将数据段数据存入指定内存地址
计算屏幕中间上一排对应的段地址为0b86eh,并将其赋值给额外数据段es
mov bx,0 用bx标记当前输出行数
mov cx,0需要输出三行,因此外层循环为3次
需要嵌套使用loop指令因此将当前cx压入栈,并标记为s1
内存循环:共16个字符,因此循环16次
计算输出到中间列的起始列偏移量为64,因此mov di,64,并将字符赋值到es:[di]
对应的颜色属性为[16+bx],将其赋值到es:[di+1]
一行输出结束,进入下一行,将es+0ah
pop cx进入下一循环。
data segment
    str db ‘try‘, 0
data ends
start:  
    mov ax, data
    mov ds, ax
    mov al, 2
    call printStr
    int 21h
    push bx
    push cx
    push si
    push di
    mov es, bx
    mov di, 0
s:      mov cl, [si]
    mov ch, 0
    jcxz over
    mov ch, al
    mov es:[di], cx
    inc si
    add di, 2
    jmp s
    pop si
    pop cx
    pop bx
    ret
end start

data segment
        x dw 1984
        str db 16 dup(0)
data ends
start:  
        mov ax, data
        mov ds, ax
        mov ax,0b800h
        mov es,ax
        mov ax, x
        mov di, offset str        
        mov si,0
        call num2str
        int 21h
        push ax
        push bx
        push cx
        push dx
        mov bl, 10
s1:      
        div bl
        inc cx
        mov dl, ah
        push dx
        mov ah, 0
        cmp al, 0
        jne s1
s2:        
        pop dx
        or dl, 30h
        mov [di], dl
        mov dh,2
        mov es:[si],dx
        add si,2
        inc di
        loop s2
        pop cx
        pop bx
        pop ax
code ends
end start
data segment
        str db 80 dup(?)
data ends
start:  
        mov ax, data
        mov ds, ax
        mov si, 0
        mov ah, 1
        int 21h
        mov [si], al
        cmp al, ‘#‘
        je next
        inc si
        jmp s1
next:
        mov cx, si
        mov si, 0
s2:     mov ah, 2
        mov dl, [si]
        int 21h
        inc si
        loop s2mov ah, 4ch
code ends
end start
?
汇编、链接、运行程序,输入一个字符串并以#结束。
int sum(int, int);
    int a = 2, b = 7, c;
}
    return (x + y);
}

上一篇:零基础的Java小白应该怎么学?
文章标题:实验4 汇编应用编程和c语言程序反汇编分析
文章链接:http://soscw.com/index.php/essay/62795.html