我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.
我能想到的是:
xor ax,ax
mov ax, 0
and ax, 0
测试平台是32位Linux.
基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
ar db "Defference $"
有什么区别
mov dx,offset ar
和
lea dx,ar
我认为两者都在做同样的工作,但这两者之间有什么区别
我这里有这个代码,但我不熟悉语法.
STACK16_SIZE    =       100h
stack16         db      STACK16_SIZE dup (?)
我认为dup意味着我们声明一个类型为array的变量,因为这是一个堆栈,但我不确定.那么dupTASM究竟意味着什么呢?
我的信息来自这里.该作业要求读取不超过20个字符的程序,将这些字符转换为大写,然后将输入打印为大写字母.
我不知道如何从int21/AH = 0ah访问输入.除非我理解上面链接的内容,否则我真的不能问更准确的问题.谁能解释一下?此外,如果这有任何区别,我正在使用TASM.另外,我正在对freedos进行测试.
UPDATE1:
好的,多亏了你的帮助,我相信我理解中断是如何设置和行为的.
设置: 我必须指定一个ds:dx,我希望这个缓冲区存在
我必须将ds:dx设置为20(设置缓冲区可以容纳的最大字符数)
我必须将ds:dx + 1设置为0(我想以某种方式设置要读入的最小字符数)
实际上调用int21/AH = 0ah,它将转到ds:dx并解释预设的字节.它会在等待输入时暂停程序
int21/AH = 0ah将从我的输入填充ds:dx + 2 + n(其中n是输入的字符数,包括'\ r')
我现在的问题是,我该怎么做.我刚刚再次查看了x86汇编语言参考,但还没有找到任何有用的东西.
代码我到目前为止
           assume          cs:code,ds:code
code       segment
start:
           mov  ax,code ;moves code segment into reg AX
           mov  ds,ax   ;makes ds point to code segment
           mov  ah,0ah
           int  21h
           mov  ax,1234h  ;breakpoint
           mov  ah,9
           mov  dx,offset message
           int  21h
endNow:
           ;;;;;;;;;;ends program;;;;;;;;;;
           mov  ah,0  ;terminate program
           int  21h   ;program ends
message    db   'Hello world!!!',13,10,'$'
code       ends
           end …考虑以下宏:
pixelFast MACRO
    ; This macro draws a pixel, assuming the coordinates are already loaded in cx&dx and the color is in al.
    xor bh, bh
    mov ah, 0ch
    int 10h
ENDM
drawRect MACRO x1, y1, x2, y2, color
    LOCAL @@loop, @@row_loop
    xor cx, cx
    mov dx, y1
    mov al, BYTE PTR [color]
    @@loop:
        mov cx, x1
        @@row_loop:
            pixelFast
            inc cx
            cmp cx, x2
            jna @@row_loop
        inc dx
        cmp dx, y2
        jna @@loop
ENDM
rendToolBar MACRO
    drawRect COLORDISP_X1, COLORDISP_Y1, COLORDISP_X2, …我是新来的组装和我目前正在读会经常表达的东西就像一个向导ax:bx,ds:dx,ss:sp。
在“精通Turbo汇编”第85页的示例中,我将使用以上示例之一。
注意,ss:sp中的逻辑地址指向堆栈中最后一个字节以下的字节。
:符号的含义是什么?
亲切的问候。
我的汇编中的简单程序有问题.我正在使用DOSbox和TASM.我有程序问题.操作数类型与第76 78 80行不匹配.这是在乘法之后.我尝试使用difftrent变量大小进行一些更改
; --------------------------------------------
; Equation=(a+c*b)/d-2*c,
; --------------------------------------------
.model small
.stack 100h
.data
        a       db 0                           
        b       db 0
        c       db 0
        d       db 0
        result1 db ?
        result2 db ?
        message1 db "Equation: (a+c*b)/d-2*c   a=$"
        message2 db "b=$"
        message3 db "c=$"
        message4 db "d=$"
        message5 db "Result=$"
.code
start:  mov ax,@data
                mov ds,ax                      
                mov ax, seg message1   ;get a and save to a variable
                mov ds,ax      
                mov dx,offset message1
                mov ah, 9h
                int 21h
                mov ah, 1h
                int …配置:
MS-DOS 16 BIT(在.asm文件中写入,然后用TASM和TLINK编译它们)
Windows 7 x64
我在Assembly中创建了一个简单的程序,它只应该打开一个文件并为其写一个文本.
这是代码:
assume cs:code, ds:data
data segment
    fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file.
    toWrite db "Hello World!", "$"
data ends
code segment
  writeToFile:
    ; pentru functia 3Dh
    mov AH, 3Dh
    mov AL, 0h
    mov dx, offset fileName
    int 21h
    ret
  start_program:
    mov ax, data
    mov ds, ax  
    CALL writeToFile
    mov ax, 4c00h
    int 21h
code ends
end start_program
我用TurboDebugger看看会发生什么.奇怪的是,它总是具有AX价值0005意义Access Denied
我在互联网上可以找到的所有东西都是ASSEMBLY …
我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:
.MODEL small
.STACK 16
.CODE
start:
    mov ax, 044c0h
    mov bl, 85
    idiv bl
exit:
    mov ax, 4c00h
    int 21h
end start
用tasm 4.1组装它,然后在DOSBox 0.74上运行它,它进入一个无限循环.当涡轮调试器检查它人们可以看到它之后发生idiv的指令,这对于一些原因,修改cs和ip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.
有没有人对此有任何解释?